Cách di chuyển tệp mà không giữ quyền


42

Vấn đề là tôi muốn có thể thấy lỗi khi di chuyển tệp, nhưng không thấy lỗi với vấn đề quyền. Nói cách khác - Tôi quan tâm nếu tệp không được truyền đầy đủ, nhưng không muốn thấy các lỗi như thế này:

mv: không thể duy trì quyền sở hữu cho `/home/blah/backup/pgsql.tar.gz ': Hoạt động không được phép

Vì vậy, tôi muốn một cái gì đó như : mv $backupfile $destination --ignore-permissions.

Tệp sao lưu có thể là bất cứ thứ gì từ 1 MiB đến 5 GiB và được chuyển qua NFS.


Nó cũng xảy ra trên thiết bị NTFS được kết nối, nhưng đây không phải là trường hợp duy nhất. Điều này xảy ra trong mọi trường hợp là bạn không có quyền thay đổi quyền hoặc không thể (như trên NTFS).
Nux

Điều này hữu ích khi cố gắng di chuyển các tệp mà bằng cách nào đó không được di chuyển do lỗi quyền (ví dụ: vì chúng được gắn kết cifs).
Sridhar Sarnobat

Câu trả lời:


56

mvlà công cụ sai cho công việc này; bạn muốn cpvà sau đó rm. Vì bạn đang di chuyển tệp sang hệ thống tệp khác, đây chính xác là những gì mvđang thực hiện phía sau hậu trường, ngoại trừ việc đó mvcũng đang cố gắng bảo toàn các bit cho phép tệp và thông tin chủ sở hữu / nhóm. Điều này là do mvsẽ lưu giữ thông tin đó nếu nó đang di chuyển một tệp trong cùng một hệ thống tệp và mvcố gắng hành xử theo cùng một cách trong cả hai tình huống. Vì bạn không quan tâm đến việc giữ các bit cho phép tệp và thông tin chủ sở hữu / nhóm, không sử dụng công cụ đó. Sử dụng cp --no-preserve=modermthay vào đó.


5
Cảm ơn, nó hoạt động. Đã kết thúc làm : cp --no-preserve=mode,ownership $backupfile $destination, kiểm tra mã thoát và sau đó làm rm $backupfilenếu mọi thứ đều ổn.
Nux

22

Khi bạn di chuyển một tệp trong cùng một hệ thống tệp, mvtách tệp khỏi vị trí cũ của nó và gắn tệp đó vào vị trí mới của nó; siêu dữ liệu như quyền vẫn giữ nguyên. Khi bạn di chuyển tệp sang một hệ thống tệp khác, mvsao chép tệp, cố gắng sao chép càng nhiều siêu dữ liệu càng tốt và xóa bản gốc.

Vì bạn đang chuyển sang một hệ thống tệp khác và bạn không muốn sao chép nhiều siêu dữ liệu, bạn cũng có thể sao chép tệp sau đó xóa tệp gốc.

cp "$backupfile" "$destination" && rm "$backupfile"

Điều này bảo vệ các quyền của tệp ở một mức độ nào đó (ví dụ như khả năng đọc trên thế giới, khả năng thực thi). Thời gian sửa đổi của tập tin không được bảo tồn. Với GNUcp , bạn có thể sử dụng --preserve=…tùy chọn để tạo ra siêu dữ liệu nào được sao chép chính xác hơn, vd --preserve=mode,timestamps.

Bạn cũng có thể sử dụng rsyncvà nói với nó những gì bạn muốn bảo tồn. Tùy chọn này -acó nghĩa là bảo tồn hầu hết các siêu dữ liệu, bao gồm chủ sở hữu nếu chỉ chạy dưới dạng root.

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"

Các rsyncgiải pháp công trình xuất sắc. Tôi đã gặp khó khăn khi cố gắng chuyển phần cài đặt Ubuntu cũ của mình khỏi chia sẻ CIFS. Rsync của tôi đã không báo cáo lỗi khi di chuyển tệp, nhưng không di chuyển tệp và chỉ báo cáo sự cố về quyền.
Sridhar Sarnobat

+1 cho rsyncgiải pháp!
MikeSchinkel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.