如何在不保留权限的情况下移动文件


42

问题是我希望能够在移动文件时看到错误,但不能看到权限问题的错误。换句话说-我关心文件是否没有完全传输,但是不想看到这样的错误:

mv:无法保留`/home/blah/backup/pgsql.tar.gz'的所有权:不允许操作

所以,我想是这样的:mv $backupfile $destination --ignore-permissions

备份文件的大小可以是1 MiB到5 GiB,并且可以通过NFS传输。


在连接的NTFS设备上也会发生这种情况,但这不是唯一的情况。在所有情况下,如果您无权更改权限或无法更改权限(例如在NTFS上),都会发生这种情况。
Nux 2014年

当尝试移动由于权限错误(例如,由于将它们挂载到cifs)而以某种方式无法移动的文件时,这很有用。
Sridhar Sarnobat

Answers:


56

mv是这项工作的错误工具;你要cp然后rm。由于将文件移动到另一个文件系统,这正是mv幕后要做的事情,除了那mv也试图保留文件许可权位和所有者/组信息。这是因为mv,如果要在同一文件系统内移动文件,并且mv在两种情况下都尝试以相同的方式运行,则会保留该信息。由于您不关心文件权限位和所有者/组信息的保留,因此请勿使用该工具。使用cp --no-preserve=moderm代替。


5
谢谢,它有效。最终做了:cp --no-preserve=mode,ownership $backupfile $destination,检查退出代码,然后检查rm $backupfile一切是否正常。
Nux 2014年

22

当您在同一文件系统中移动文件时,mv将文件与旧位置分离,并将其附加到新位置;元数据(例如权限)保持不变。当您将文件移动到另一个文件系统时,请mv复制该文件,尝试复制尽可能多的元数据,然后删除原始文件。

由于要转移到其他文件系统,并且不想复制太多的元数据,因此最好先复制文件,然后再删除原始文件。

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

这在一定程度上保留了文件的权限(例如,世界可读性,可执行性)。不会保留文件的修改时间。使用GNUcp,您可以使用该--preserve=…选项控制更精细地复制哪些元数据,例如--preserve=mode,timestamps

您还可以使用rsync并告诉您要保留的内容。该选项-a表示“保留大多数元数据”,如果仅以root身份运行,则包括所有者。

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

rsync解决方案效果极佳。我一直在努力从CIFS共享转移旧的ubuntu安装。我的rsync没有报告移动文件失败,但是没有移动文件,而只是报告权限问题。
Sridhar Sarnobat

+1 rsync解决!
MikeSchinkel '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.