这与一个(封闭的)问题非常相似:Bash scripting copying files without overwriting。我给出的答案引用了find | cpio
其他答案中提到的“”解决方案(减去时间标准,但这是“相似”和“相同”之间的区别),并且还概述了使用 GNU 'tar' 的解决方案。
时间
当我在 Solaris 上进行测试时,GNU tar 和 (Solaris) cpio 都无法保留 ctime 设置;实际上,我不确定是否有任何方法可以做到这一点。例如,该touch
命令可以设置 atime 或 mtime 或两者,但不能设置 ctime。系统utime()
调用也只取 mtime 或 atime 值;它不处理 ctime。所以,我相信如果你找到了一个保留 ctime 的解决方案,那么这个解决方案很可能是特定于平台的。(奇怪的例子:破解磁盘设备并编辑 inode 中的数据 - 不可移植,需要提升权限。)不过,重读这个问题,我发现“保留 ctime”不是要求的一部分(呸);它只是文件是否被复制的标准。
目录
我认为 ' cd
' 操作是必要的 - 但是它们可以完全本地化到脚本或命令行,如引用的问题和下面的命令行所示,其中第二个假设是 GNU tar。
(cd /my; find source/directory -ctime -2 | cpio -pvdm /my/dest/directory)
(cd /my; find source/directory -ctime -2 | tar -cf - -F - ) |
(cd /my/dest/directory; tar -xf -)
如果不使用chdir()
(aka cd
),您需要专门的工具或选项来动态处理路径名的操作。
带有空格、换行符等的名称
正如 Adam Hawes 所指出的,特定于 GNU 的 ' find -print0
' 和 ' xargs -0
' 非常强大和有效。有趣的是,GNUcpio
有一个选项来处理来自 ' find -print0
' 的输出,那就是 ' --null
' 或其缩写形式 ' -0
'。因此,使用 GNUfind
和 GNU cpio
,安全命令是:
(cd /my; find source/directory -ctime -2 -print0 |
cpio -pvdm0 /my/dest/directory)
注意:这不会覆盖备份目录下的预先存在的文件。-u
为此添加cpio
命令。
同样,GNUtar
支持--null
(显然没有-0
短格式),也可以使用:
(cd /my; find source/directory -ctime -2 -print0 | tar -cf - -F - --null ) |
(cd /my/dest/directory; tar -xf -)
GNU 对带有空终止符的文件名的处理非常聪明并且是一项有价值的创新(尽管我最近才意识到它,感谢 SO;它在 GNU tar 中已经存在至少十年了)。