如何将一个目录递归复制到另一个目录并仅替换未更改的文件?
-
03-07-2019 - |
题
我希望在 Fedora 中制作一个特定的副本。
我有两个文件夹:
'网络根':保存所有网络文件/图像等
'出口':包含从我的 SVN 存储库导出的数千个 PHP、CSS、JS 文档的文件夹。
导出目录包含许多与根目录相同的文件/文件夹,但是根目录包含导出中未找到的其他文件/文件夹。
我想使用以下选项将导出的所有内容与我的 webroot 合并:
- 如果导出的版本包含与WebRoot版本(live)中的代码不同的代码,则在WebRoot中覆盖该文件
- 如果文件被覆盖(替换实时版本的导出版本),请保留权限/用户/组
- 没有任何形式的副本的提示/停止(即不详细)
- 递归副本 - 显然我想复制所有*文件夹和子文件夹中的所有*
我对 cp 做了一些研究 - 这能完成这项工作吗?:
cp -pruf ./export /path/to/webroot
解决方案
可能会,但任何时候相应的文件 export
和 webroot
具有相同的内容但不同的修改时间,您最终会执行不必要的复制操作。你可能会得到稍微聪明的行为 rsync
:
rsync -pr ./export /path/to/webroot
除了, rsync
如果您需要的话,可以通过 SSH 连接将文件从一台主机复制到另一台主机。另外,它有无数的选项,您可以指定来调整其行为 - 请查看手册页以获取详细信息。
编辑: :关于您对保留权限含义的澄清:你可能想要放弃 -p
选项。
其他提示
- -u 如果目标比源旧,则覆盖现有文件夹
- -p 保留权限和日期
- -f 关闭详细信息
- -r 使复制递归
所以看起来你已经获得了 cp 的所有正确参数
听起来像是一份工作 cpio
(因此,GNU tar 可能也可以做到):
cd export
find . -print | cpio -pvdm /path/to/webroot
当然,如果您需要保留所有者,则必须以 root 身份进行。这 -p
选项是“pass mode”,意思是在位置之间复制; -v
很冗长(但不是交互式的;是有区别的); -d
表示根据需要创建目录; -m
意味着保留修改时间。默认情况下,不带 -u
选项, cpio
不会覆盖目标区域中比源区域中的文件新的文件。
不隶属于 StackOverflow