我怎样才能recursion复制一个目录到另一个只replace没有改变的文件?

我期待在Fedora中做一个特定的副本。

我有两个文件夹

  • 'webroot':保存所有的网页文件/图片等

  • 'export':包含数千个从SVN仓库导出的PHP,CSS,JS文档的文件夹。

导出目录包含许多与根相同的文件/文件夹,但是根包含在导出中找不到的其他文件/文件夹。

我想合并所有的导出内容与我的webroot与以下选项:

  1. 如果导出的版本包含不同于webroot版本(实况)内的代码,则覆盖webroot中的文件
  2. 保留文件的权限/用户/组(如果被覆盖(导出版本取代实时版本))*注意我希望维护webroots的权限/所有权,但是导出的内容
  3. 没有提示/停止任何forms的副本(即不详细)
  4. recursion副本 – 显然我想复制在导出中find的所有*文件夹和子文件夹

我已经做了一些关于cp的研究 – 这是否可以完成这项工作?

cp -pruf ./export /path/to/webroot 

Solutions Collecting From Web of "我怎样才能recursion复制一个目录到另一个只replace没有改变的文件?"

它可能,但任何时候, exportwebroot的相应文件有相同的内容,但修改时间不同,你会结束执行不必要的复制操作。 你可能会从rsync稍微聪明的行为:

 rsync -pr ./export /path/to/webroot 

此外,如果您有需要, rsync可以通过SSH连接将文件从一台主机复制到另一台主机。 另外,它有一个你可以指定的选项来调整它的行为 – 查看手册页的细节。

编辑 :关于你通过保留权限来说明你的意思:你可能想要放弃-p选项。

  1. -u覆盖现有的文件夹,如果目的地比源代码早
  2. -p保留权限和日期
  3. -f关闭冗长
  4. -r使复制递归

所以看起来你得到了所有正确的参数

听起来像cpio的工作(因此,也许,GNU焦油也可以做到这一点):

 cd export find . -print | cpio -pvdm /path/to/webroot 

如果你需要保存所有者,当然,你必须以根为根本。 -p选项是“传递模式”,意思是位置之间的复制; -v是详细的(但不是交互式;有一个区别); -d表示根据需要创建目录; -m意味着保留修改时间。 默认情况下,如果没有-u选项, cpio将不会覆盖目标区域中比源区域更新的文件。