数十万の小さなファイルがフォルダを扱うのが難しくなる問題が発生しました。
実行時にエラーを返すファイルがたくさんありrm -rf
、私たちがしなければならないことは次のとおりです。
find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;
この方法は動作しますが、非常に遅く、メモリ不足のために失敗することがよくあります。
もっと良い方法がありますか?理想的には、内容を気にせずにディレクトリ全体を削除したいと思います。
答え1
rsyncの使用は驚くほど速くて簡単です。
mkdir empty_dir
rsync -a --delete empty_dir/ yourdirectory/
@sarathの返信別のクイックオプションが言及されました:Perl!ベンチマークはrsync -a --delete
。
cd yourdirectory
perl -e 'for(<*>){((stat)[9]<(unlink))}'
またはなしstat
(必要かどうかは議論の余地があります。一部の人々はそれがあればより速くなると言い、他の人はそれがなければより速いと言います):
cd yourdirectory
perl -e 'for(<*>){unlink}'
源泉:
答え2
ここで誰かTwitter-delete
代わりに使用することをお勧めします。-exec rm -f{} \;
これにより、コマンドはより効率的になりますが、まだ再帰を使用してすべてを繰り返します。
答え3
きちんとしたトリック:
rsync -a --delete empty/ your_folder/
スーパーCPU集約的ですが、非常に高速です。バラよりhttps://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html
答え4
コメントの1つを拡張すると、あなたがやっていると思うことをしているようではありません。
まず、状況をシミュレートするために複数のファイルを作成しました。
$ mkdir foo
$ cd foo/
$ for X in $(seq 1 1000);do touch {1..1000}_$X; done
その後、失敗すると予想されるタスクと質問で実行されているタスクを試しました。
$ rm -r foo/*
bash: /bin/rm: Argument list too long
しかし、これはする働く:
$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory