在特定日期范围内将文件从一个文件夹复制到另一个文件夹

在特定日期范围内将文件从一个文件夹复制到另一个文件夹

我已经使用以下命令从特定日期复制文件。

以前我使用过这个命令,它运行良好,但现在它显示一个错误:

-bash: /bin/cp: Argument list too long

使用的赞扬:

cd /share/new/
cp `find . -type f -newermt '16 july 2018'` /share/test

我需要复制 7 月 20 日至今天为止“new”文件夹中的所有文件。我该如何实现?

答案1

不要cp直接与 的输出一起使用find

它可能在一个步骤中传递太多文件(这就是您收到错误的原因Argument list too long)。

使用-exec的参数find,执行给定的命令,将每个匹配的文件cp逐个传递给 :

cd /share/new/
find . -type f -newermt '16 july 2018' -exec cp {} /share/test \;

答案2

使用find -exec

find /share/new/ -type f -newermt '16 july 2018' -exec cp {} /share/test \;

答案3

利用-exec的操作find-t的选项cp;如果您不想意外覆盖同名文件,我还建议使用-i或选项:-n

find ... -exec cp -i -t TARGET -- {} +

其他当前答案cp为每个匹配的文件生成一个子进程,而这个答案只根据总程序参数长度限制(见下文)生成尽可能多的子进程,一旦达到几千个匹配项,就会产生很大的不同,这似乎是你的情况。


来自find(1)手动的:

  • -exec command ;– 执行命令 […]。 find 的所有后续参数都被视为命令的参数,直到;遇到由 组成的参数。 该字符串{}被替换为当前文件名,该文件名在命令的参数中出现的所有位置都会被处理 […]。 指定的命令针对每个匹配的文件运行一次。 […]

  • -exec command {} +– 此-exec操作的变体对选定的文件运行指定的命令,但命令行是通过在末尾附加每个选定文件名来构建的;命令的总调用次数将远少于匹配文件的数量。[…]

来自cp(1)手动的:

  • -t, --target-directory=DIRECTORY– 将所有 SOURCE 参数复制到 DIRECTORY
  • -i, --interactive– 覆盖前提示
  • -n, --no-clobber– 不覆盖现有文件

答案4

您应该尝试这个语法:

find /share/new/ -type f -newermt '16 july 2018' -exec cp -R /share/test/ {} \;

相关内容