我有一个/data
文件夹,里面有无数的文件和文件夹,花了一晚上的时间来复制。
cp -r /data/* /data2
我通过忘记将其复制为rootp
我在目的地的所有东西都归 root 所有。
我没有删除源代码/data
,但如果不需要,我不想重新复制。
有没有办法在源和目标之间仅复制权限或同步权限?
答案1
mtree
可以做到这一点,并提供了根本不需要读取文件内容的优点。它仅比较文件元数据,并修改目标以匹配源:
$ sudo mtree -cp /data | sudo mtree -Utp /data2
-c
告诉 LHSmtree
创建一个以 路径为根的层次结构规范-p
,/data
并且 RHS调用更新以 为根的层次结构的mtree
所有者/组/权限-U
和修改时间。-t
-p /data2
答案2
我会用rsync
:
rsync -avic --progress /data/ /data2
注意:
尾随/
是/data/
故意的,它确保rsync
不会创建/data2/data
并重新复制其下的所有文件。 (你不需要/
尾随/data2
)
这些选项是:
-a
以“archive”命名,但实际上打开了一堆有用的选项(例如递归下降到子目录),这些选项将模仿您的cp -r
命令的行为。
-v
并使-i
副本变得详细,并显示如何rsync
设置复制文件的权限和所有权,这在复制过程中非常有用。
-c
使用校验和来决定是否应复制每个文件中的数据。这将rsync
跳过复制文件内容,仅调整目标文件的所有权/权限。
--progress
不是必需的,但显示将任何文件内容复制到目标的进度。
-v
和选项-i
将使每个文件在终端窗口中至少滚动一行。如果您不想要这个,请忽略它们。如果您希望 rsync 进行详细的试运行,告诉您它将做什么,但不更改文件,您可以添加-n
(即)。-avicn
因此,对选项进行试运行-avicn --progress
,然后仅使用-ac --progress
选项进行实际操作可能更适合您。