如何递归地将一个目录复制到另一个目录,并仅替换未更改的文件?

20
我想在Fedora中进行特定的复制操作。
我有两个文件夹:
- 'webroot':保存所有网络文件/图像等。 - 'export':包含数千个从我的SVN存储库导出的PHP、CSS和JS文档。
导出目录包含许多与根目录相同的文件/文件夹,但是根目录包含未在导出中找到的其他文件/文件夹。
我想合并导出的所有内容到我的webroot,并使用以下选项:
1. 如果导出版本的文件包含与webroot版本不同的代码(现行版本),则覆盖webroot中的文件。 2. 如果覆盖文件,则保留文件的权限/用户/组(导出版本替换现行版本)*注:我希望维护webroots的权限/所有权,但使用导出的内容。 3. 不提示/停止任何类型的复制(即不冗长)。 4. 递归复制-显然,我想复制在导出中找到的所有文件夹、子文件夹和文件。
我已经研究了一下cp命令,这样做可以吗?
cp -pruf ./export /path/to/webroot

请注意,您的第一个标准并不是明确的。大多数答案都假定您的意思是“如果Webroot中的文件比导出文件新,则不要更改它”。如果您真正的意思是“比较内容并在有差异的情况下复制导出版本”,那么只需复制所有内容...继续... - Jonathan Leffler
...继续...随着新文件的出现,那些在两个位置相同的旧文件在复制后仍将保持不变 - 除了修改时间可能会有所不同。 - Jonathan Leffler
3个回答

25

这可能会起作用,但是如果在 exportwebroot 中相应的文件具有相同的内容但修改时间不同,则最终会执行不必要的复制操作。您可能会从 rsync 获得稍微更智能的行为:

rsync -pr ./export /path/to/webroot
此外,rsync可以通过SSH连接从一台主机复制文件到另一台主机,如果您有这样的需要。此外,它有无数个选项可供指定以调整其行为-请查看man页面以获取详细信息。 编辑:关于您对保留权限含义的澄清:您可能希望省略-p选项。

6
  1. -u:如果目标文件夹比源文件夹旧,则覆盖已存在的文件夹
  2. -p:保留权限和日期
  3. -f:关闭冗长输出
  4. -r:递归复制

看起来你已经正确使用了cp命令的所有参数。


5
听起来需要使用 cpio(因此,可能也可以使用GNU tar)来完成此任务:
cd export
find . -print | cpio -pvdm /path/to/webroot

如果您需要保留所有者信息,当然要以root身份运行。选项-p是“传递模式”,意味着在位置之间复制;-v是详细模式(但不是交互模式,两者有区别);-d表示必要时创建目录;-m表示保留修改时间。默认情况下,没有-u选项,cpio不会覆盖目标区域中比源区域更新的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接