2016-10-19 7 views
2

複数のフォルダ内の50,000を超える画像を、Terminal(Mac OSX El Capitan)を使用して1つのフォルダにコピーしようとしています。私が使用して、いくつかの画像でこれを達成するために管理してきました:再帰を使用して複数の画像を新しいフォルダにコピー

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

を50,000画像にこのコードを実行しようとしたときしかし、私は(引数リストが長すぎます)エラーが発生します。このエラーをどのように克服し、おそらくこのプロセスをスピードアップしますか(おそらくGNU並列を使用していますか?)。

私はsystem()を使ってR内からこれを実行したいと考えています。

ありがとうございます!

+0

をコピーすることができませんでした

copysucceeded <- file.copy(flist, tempdir()) 

表示ファイル:http://unix.stackexchange.com/questions/124527/speed-up-copying-1000000-small-files –

答えて

3

これは、ARG_MAX(またはglibc以外のライブラリに類似している)がトリガーされているために発生しています。一度にファイル1をコピー

非効率的な、:

find . -type f -iname '*.jpg' -exec cp {} /foo/bar \; 

あなたはGNU cp持っている場合は、あなたがfind-execアクションで+を活用することができます

find . -type f -iname '*.jpg' -exec cp -t /foo/bar {} + 
+0

ダブル'' {} ''でファイルを引用すると、ファイル名に空白が残されます。また、' -v'フラグが冗長になると読みやすくなります。 +1 – Inian

+0

OK私はかなりフォローしていません。私はエラー(cp:illegal option - t)を得続けます。ただ確認するために、画像付きの複数のフォルダを含む親フォルダに移動します。それから私はfindを使う。 -type f -iname '*。jpg '-exec cp -t/foo/bar {} +/foo/barセクションに従っていませんか?親フォルダ内にfooという名前のフォルダが必要です。そのフォルダ内にbarというフォルダがありますか?申し訳ありませんが、おそらく私は少し高密度ですか?誰もが助けてくれてありがとう!心から感謝する。 – Ross

+0

@Inianコマンドラインが追加によって構築されるので、明らかに '+'は 'cp {}'では動作しません。また、 '{}'はファイル名を空白で処理します。 – heemayl

0

Try-

find . -name "*.jpg" | xargs -i cp {} resultsFolder 
+0

'xargs'とcp'は必要ではありません。' find'自身が '-exec'オプションを使ってコピー/移動アクションを行うことができます。 – Inian

0

exacがありますこれを行うにはTLY 1素晴らしい方法:

find . -name "*.jpg" -print0 | xargs -0 cp -t resultsFolder 

これはいつもより早く> 1ファイルのfind -exec cp {}またはfind | xargs -i cp {}よりも、およびファイル名の文字のいずれかの種類を処理します。大容量ファイルの場合は、ほとんどの時間が実際にコピーされるため、代替ファイルよりもわずかに高速です。多くの小さなファイルでは、1桁も速くなる可能性があります。

テスト:コピー3422〜20kのファイル(OSXヨセミテ、2013年後半のMacBook Proは、2.6 GHzのi7の、16ギガバイトのRAM、500ギガバイトSSD):

find -exec cp {}   29.445s 
find | xargs -i cp {} 22.800s 
find | xargs cp -t  0.599s 
1

this answerに基づいてRの実装(あなたが"/tmp"を置き換えることができます選択した結果フォルダが表示されます)。

flist <- list.files(".", "*.jpg", full.names = TRUE, recursive = TRUE) 
file.copy(flist, "/tmp") 

重複するファイル名がある場合、それらはコピーされません。 コピー操作の結果を保存すると、Rはコピーされなかったファイルを知ることができます(同様にtempdir()を任意のディレクトリに置き換えることができます)。高速化のために

flist[!copysucceeded] 
関連する問題