Bro*_*ses 43 timestamps synchronization files
我想将一组文件从目录 A 复制到目录 B,但需要注意的是,如果目录 A 中的文件与目录 B 中的文件相同,则不应复制该文件(因此其修改时间不应为更新)。有没有办法用现有的工具做到这一点,而无需编写自己的脚本来做到这一点?
详细说明我的用例:我正在.c临时目录中自动生成一堆文件(通过必须无条件生成所有文件的方法),当我重新生成它们时,我只想复制已更改为实际源目录的那些,保留未更改的(使用它们的旧创建时间)保持不变,以便make知道不需要重新编译它们。(.c不过,并非所有生成的文件都是文件,因此我需要进行二进制比较而不是文本比较。)
(注意:这是我在/sf/ask/628708671/#8981762 上提出的问题,我在那里尝试为了加快我用来执行此操作的脚本文件的速度,但我突然想到,我真的应该问是否有比编写自己的脚本更好的方法来执行此操作——尤其是因为在 shell 中执行此操作的任何简单方法脚本将cmp在每对文件上调用类似的东西,并且启动所有这些进程需要很长时间。)
小智 34
rsync 可能是最好的工具。此命令有很多选项,因此请阅读手册页。我想你想要 --checksum 选项或 --ignore-times
小智 32
您可以使用-u开关来cp喜欢这样:
$ cp -u [source] [destination]
Run Code Online (Sandbox Code Playgroud)
从手册页:
-u, --update
copy only when the SOURCE file is newer than the destination file or
when the destination file is missing
Run Code Online (Sandbox Code Playgroud)
虽然使用rsync --checksum是“如果更改则复制”的一种很好的通用方法,但在您的特定情况下有一个更好的解决方案!
如果您想避免不必要地重新编译文件,您应该使用专为此目的而构建的ccache!事实上,它不仅可以避免对自动生成的文件进行不必要的重新编译,而且还可以在您这样做make clean并从头开始重新编译时加快速度。
接下来我肯定你会问,“它安全吗?” 嗯,是的,正如网站指出的那样:
安全吗?
是的。编译器缓存最重要的方面是始终生成与真实编译器将生成的输出完全相同的输出。这包括提供完全相同的目标文件和完全相同的编译器警告,如果您使用真正的编译器,则会产生这些警告。您应该能够告诉您正在使用 ccache 的唯一方法是速度。
而且它易于使用只需添加它作为前缀是CC=你的makefile行(或者你可以使用符号连接,但生成文件的方式可能会更好)。
这应该可以满足你的需要
diff -qr ./x ./y | awk '{print $2}' | xargs -n1 -J% cp % ./y/
Run Code Online (Sandbox Code Playgroud)
在哪里: