根据日期和目录结构复制文件

根据日期和目录结构复制文件

我赞扬:

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选项意味着它只是一次试运行,因此您可以看到它会做什么(与-vfor冗长)。一旦您对它的功能感到满意,就可以运行它-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

您可以使用findcp来完成此操作--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

相关内容