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

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

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

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

所以我想要类似的东西mv $backupfile $destination --ignore-permissions

备份文件可以是 1 MiB 到 5 GiB 之间的任何文件,并通过 NFS 传输。

答案1

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

答案2

当您在同一文件系统中移动文件时,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"

相关内容