我已经使用以下命令从特定日期复制文件。
以前我使用过这个命令,它运行良好,但现在它显示一个错误:
-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/ {} \;