我赞扬:
find /source/ -type f -newermt '18 dec 2020' -exec cp -t /target/ {} +
这个命令只复制文件,不复制目录结构,但我需要带有其父目录的文件。
第二件事是为什么我复制文件时文件日期会改变?我复制修改文件时可以不改变修改文件的日期吗?
答案1
有一个--preserve=all
选项可以cp
查看man cp
;
但我建议使用rsync
而不是cp
;它更加灵活,并且可以轻松保留时间戳,并仅复制较新的文件。 它支持的所有这些选项有一定的学习曲线,但值得深入研究。
正常用例看起来是这样的:
rsync -n -av /some/where/sourcedir .
这会递归复制源目录到当前目录作为子目录sourcedir/
。它不会触及已经存在且具有相同时间戳/内容的文件。该-n
选项意味着它只是一次试运行,因此您可以看到它会做什么(与-v
for冗长)。一旦您对它的功能感到满意,就可以运行它-n
:
rsync -av /some/where/sourcedir .
您可以反复调用它;如果它不再执行任何操作,则它确实已经完成了。
你也可以删除源目录树中不再存在的文件--delete
:
rsync -av --delete /some/where/sourcedir .
如果在源路径后面附加一个斜杠,它不会sourcedir/
在目标上创建子目录,而是直接将其复制到该子目录中。与 一起--delete
,它还会在当前目录中创建该树的 1:1 副本,删除源子树中不存在的所有内容:
rsync -av --delete /some/where/sourcedir/ .
再次添加-n
以查看它会做。一般来说,我强烈建议始终-n
先使用以确认它是否会执行您想要的操作。
还有许多其他选项(例如--exclude=
);请参阅man rsync
。
答案2
您可以使用find
和cp
来完成此操作--parents
,但这需要 ../target 存在。
(builtin cd source; find -type f \
-newermt '18 dec 2020' -exec cp --parents -at ../target {} +)
第二个选项使用cpio
性能更高的选项。而前面的示例使用cd
删除初始点在复制之前,我们使用-printf
指令和来完成此cpio -D
操作。并且这不需要在复制之前存在目标。
find source/ -mindepth 1 -depth -type f \
-newermt '18 dec 2020' -printf %P\\0 | cpio -0 -pvdm -D source/ target