问题是我希望能够在移动文件时看到错误,但看不到权限问题的错误。换句话说 - 我关心文件是否未完全传输,但不想看到这样的错误:
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=mode
andrm
代替。
答案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"