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

Nux*_*Nux 57 bash mv

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

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

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

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

Kyl*_*nes 78

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

  • 谢谢,它有效。最终做:`cp --no-preserve=mode,ownership $backupfile $destination`,检查退出代码,如果一切正常,然后执行 `rm $backupfile`。 (7认同)

Gil*_*il' 28

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

由于您要迁移到不同的文件系统并且不想复制太多元数据,因此您不妨复制文件然后删除原始文件。

cp "$backupfile" "$destination" && rm "$backupfile"
Run Code Online (Sandbox Code Playgroud)

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

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

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"
Run Code Online (Sandbox Code Playgroud)