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

时间:2009-03-02 04:13:15

标签: linux filesystems copy directory administration

我希望在Fedora中做一个特定的副本。

我有两个文件夹:

  • 'webroot':持有所有网络文件/图像等

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

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

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

  1. 如果导出的版本包含的代码与代码不同,则覆盖webroot中的文件 是在webroot的版本(实时)
  2. 如果文件被覆盖(保存,则保留文件的权限/用户/组) 版本替换实时版本)*注意我希望保持webroots权限/所有权,但使用导出的内容
  3. 没有提示/停止副本 任何形式(即不详细)
  4. 递归副本 - 显然我 想复制所有*文件 找到的文件夹和子文件夹 出口
  5. 我对cp进行了一些研究 - 这可以做到这一点吗?:

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

3 个答案:

答案 0 :(得分:24)

可能,但是只要exportwebroot中的相应文件具有相同的内容但修改时间不同,您最终会执行不必​​要的复制操作。您可能会从rsync获得稍微聪明的行为:

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

此外,rsync可以通过SSH连接将文件从一个主机复制到另一个主机,如果您需要这样做的话。此外,它还有许多选项可供您调整以调整其行为 - 请参阅手册页以获取详细信息。

编辑:关于您对保留权限的含义的澄清:您可能希望不使用-p选项。

答案 1 :(得分:6)

    如果目标比源旧,则
  1. -u会覆盖现有文件文件夹
  2. -p持有权限和日期
  3. -f关闭详细程度
  4. -r使副本递归
  5. 所以看起来你得到了所有正确的args到cp

答案 2 :(得分:5)

听起来像cpio的工作(因此,GNU tar可能也可以这样做):

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

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