我尝试使用终端(Mac OSX El Capitan)将多个文件夹中的50,000多张图像复制到一个文件夹中。我使用以下几张图片设法实现了这一目标:
cp `find . -name "*.jpg"` resultsFolder
然而,当我尝试在50,000张图像上运行此代码时,我收到一个错误(参数列表太长)。我如何克服这个错误,并且可能加快这个过程(也许使用GNU并行?)。
我也希望使用system()
从R中运行此功能。
提前致谢!
答案 0 :(得分:3)
这种情况正在发生,因为正在触发ARG_MAX
(或类似于glibc
以外的库)。
低效,一次复制一个文件:
find . -type f -iname '*.jpg' -exec cp {} /foo/bar \;
如果您拥有GNU cp
,则可以+
-exec
find
行动使用find . -type f -iname '*.jpg' -exec cp -t /foo/bar {} +
:
find . -name "*.jpg" | xargs -i cp {} resultsFolder
答案 1 :(得分:1)
基于this answer的R实现(您可以将"/tmp"
替换为您选择的结果文件夹)。
flist <- list.files(".", "*.jpg", full.names = TRUE, recursive = TRUE)
file.copy(flist, "/tmp")
如果有任何重复的文件名,则不会复制它们。
R可以告诉你哪些文件没有复制,如果
存储复制操作的结果(类似地,您可以用您选择的目录替换tempdir()
)。
copysucceeded <- file.copy(flist, tempdir())
显示无法复制的文件
flist[!copysucceeded]
答案 2 :(得分:0)
尝试 -
helpdesk.public.php
答案 3 :(得分:0)
有一种很棒的方法可以做到这一点:
find . -name "*.jpg" -print0 | xargs -0 cp -t resultsFolder
对于&gt;总是更快1个文件而不是find -exec cp {}
或find | xargs -i cp {}
,并处理文件名中的任何类型的字符。对于大型文件,它只比其他选项略快,因为大部分时间都花在实际复制上。对于许多小文件,它可以快一个数量级。
测试:复制3422~20k文件(OSX Yosemite,2013年末MacBook Pro,2.6 GHz i7,16 GB RAM,500GB SSD):
find -exec cp {} 29.445s
find | xargs -i cp {} 22.800s
find | xargs cp -t 0.599s