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

Posted

技术标签:

【中文标题】如何递归地将目录复制到另一个目录并仅替换未更改的文件?【英文标题】:How can I recursively copy a directory into another and replace only the files that have not changed? 【发布时间】:2010-10-10 17:12:48 【问题描述】:

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

我有两个文件夹:

'webroot':保存所有网络文件/图像等

'export':包含从我的 SVN 存储库导出的数千个 php、CSS、JS 文档的文件夹。

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

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

    如果导出版本包含的代码与当前版本不同,则覆盖 webroot 中的文件 在 webroot 的版本中(live) 如果文件被覆盖,请保留文件的权限/用户/组(导出 版本替换实时版本)*注意我希望维护 webroots 权限/所有权,但要包含导出的内容 没有提示/停止复制 任何类型的(即不冗长) 递归复制 - 显然我 想复制所有*文件 中找到的文件夹和子文件夹 出口

我对 cp 进行了一些研究 - 这可以完成这项工作吗?:

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

【问题讨论】:

请注意,您的第一个标准并不明确。答案大多假设您的意思是“如果 webroot 中的文件比导出中的文件新,请不要理会它”。如果您的意思是“比较内容并复制导出版本,如果有差异”,那么只需复制所有内容......继续...... ...继续...因为新文件将出现,而两者中相同的旧文件在复制后仍将相同 - 可能除了修改时间。跨度> 感谢您的反馈 - 我会更新问题 【参考方案1】:

可能,但是任何时候exportwebroot 中的对应文件具有相同的内容但不同的修改时间,您最终会执行不必​​要的复制操作。你可能会从rsync 那里得到更聪明的行为:

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

此外,rsync 可以通过 SSH 连接将文件从一台主机复制到另一台主机,如果您有需要的话。此外,它还有无数个选项可供您指定以调整其行为 - 请查看手册页了解详细信息。

编辑:关于您对保留权限的意思的澄清:您可能希望放弃-p 选项。

【讨论】:

【参考方案2】:
    -u 如果目标位置早于源文件,则覆盖现有文件夹 -p 保留权限和日期 -f 关闭详细程度 -r 使复制递归

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于如何递归地将目录复制到另一个目录并仅替换未更改的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如果文件不匹配,则递归地将一个目录复制到另一个目录

如何在目录树中递归查找和替换所有出现的字符串? [复制]

如何递归查找目录中最新修改的文​​件?

linux 怎么样复制文件夹内所有文件到另一个文件夹

如何使用 PHP 将文件从一个目录复制到另一个目录?

linux如何怎样将一个目录下的文件复制到另一个目录下?