使用递归将许多图像复制到新文件夹

时间:2016-10-19 06:02:51

标签: r bash terminal parallel-processing

我尝试使用终端(Mac OSX El Capitan)将多个文件夹中的50,000多张图像复制到一个文件夹中。我使用以下几张图片设法实现了这一目标:

cp `find . -name "*.jpg"` resultsFolder

然而,当我尝试在50,000张图像上运行此代码时,我收到一个错误(参数列表太长)。我如何克服这个错误,并且可能加快这个过程(也许使用GNU并行?)。

我也希望使用system()从R中运行此功能。

提前致谢!

4 个答案:

答案 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