進捗状況を表示しながら、ディレクトリから数十億のファイルを削除する

進捗状況を表示しながら、ディレクトリから数十億のファイルを削除する

私は何十億ものファイルがすべてJPEGファイル形式で含まれている30TBのディレクトリを持っています。次のように各フォルダのファイルを削除します。

sudo rm -rf bolands-mills-mhcptz

コマンドが実行され、動作しているかどうかに関係なく、何も表示されません。

ファイルを削除するのか、コマンドの現在の状態がどのようなものかを知りたいです。

答え1

削除したファイルごとに1行ずつrm -v印刷できますrm。これにより、rmファイルの削除が実際に機能していることを確認できます。ただし、何十億ものファイルがある場合は、rmそのファイルがまだ機能していることがわかります。どのくらいのファイルが削除されたか、どれだけ残っているのかわかりません。

このツールはpv進行状況を予測するのに役立ちます。

http://www.ivarch.com/programs/pv.shtml

rmサンプル出力を使用して呼び出す方法は次のとおりです。pv

$ rm -rv dirname | pv -l -s 1000 > logfile
562  0:00:07 [79,8 /s] [====================>                 ] 56% ETA 0:00:05

pvこの人工的な例では、ファイルがあると言いました1000。出力にはpv562が削除され、経過時間は7秒、予想完了時間は5秒です。

いくつかの説明:

  • pv -lpvバイトではなく改行文字で計算
  • pv -s numberpv総額がいくらであるかを教えてください。
  • logfile最終リダイレクトはきちんとした出力のためです。それ以外の場合、ステータス行はpvの出力と混同されますrm -v。ボーナス:削除内容のログファイルが提供されます。ただし、ファイルが非常に大きくなる可能性があることに注意してください。/dev/nullログが必要ない場合は、リダイレクトすることもできます。

ファイル数を取得するには、次のコマンドを使用できます。

$ find dirname | wc -l

何十億ものファイルがある場合でも、時間がかかることがあります。pvここでどれだけ計算されたかを確認することもできます。

$ find dirname | pv -l | wc -l
278k 0:00:04 [56,8k/s] [     <=>                                              ]
278044

ここでは278k個のファイルを計算するのに4秒かかったという。 ()末尾の正確な数はの278044出力ですwc -l

カウントを待たない場合は、ファイル数を推測するか、pv直接使用できます。

$ rm -rv dirname | pv -l > logfile

これにより、達成したい操作を推定することはできませんが、少なくとも削除されたファイルの数を確認できます。/dev/nullログファイルが不要な場合にリダイレクトしてください。


残響:

  • 本当に必要ですかsudo
  • 通常rm -r、再帰的に削除すれば十分です。不要rm -f

答え2

確認するレスマナの答え、それは私のものよりはるかに優れています。特に、pv代わりに指定すると、生の沈黙よりもはるかに時間がかからない最後の例です。rm/dev/nulllogfile

そのオプションをサポートしていると仮定するとrm(Linuxを実行しているためサポートされます)、以下を使用して詳細モードで実行できます-v

sudo rm -rfv bolands-mills-mhcptz

多くのコメントが指摘したように、端末で生成され表示される出力の量が多いため、速度が非常に遅くなる可能性があります。出力をファイルにリダイレクトできます。

sudo rm -rfv bolands-mills-mhcptz > rm-trace.txt

そしてサイズを観察してみてくださいrm-trace.txt

答え3

別のオプションは、ファイルシステムのファイル数が減少することを観察することです。別の端末で次を実行します。

watch  df -ih   pathname

rm進むにつれて、使用されるinodeの数が減少します。 (たとえば、ツリーはcp -al複数のファイル(およびディレクトリ)の削除の進行状況を追跡します。使用されたスペースは追跡されませdfん。-i

また、実行iostat -x 4すると、1秒あたりのI / O操作(およびkiB / s、しかしこれは純粋なメタデータI / Oとの関連性が低い)を見ることもできます。


rm現在処理中のファイルが何であるか疑問に思っている場合は、そのファイルに添付して端末にシステムコールが表示されるかどうかをstrace確認(およびgetdents)できます。unlink()たとえばsudo strace -p $(pidof rm)^cstraceを中断することなく分離できます。rm

rm -r削除したいツリーにディレクトリを変更したことを忘れました。その場合は見てください/proc/<PID>/cwd。 fdディレクトリを開くことが多いので、そのディレクトリを調べて、現在のプロセスが何を見ているのかを/proc/<PID>/fd確認できます。rm

答え4

あなたができることの1つは、バックグラウンドでプロセスを開始してから(出力がないため遅くならない)、単純なrma)コマンドを使用してフォアグラウンドで監視することです。

pax> ( D=/path/to/dir ; rm -rf $D & while true ; do
...>   if [[ -d $D ]] ; then
...>     echo "$(find $D | wc -l) items left"
...>   else
...>     echo "No items left"
...>     break
...>   fi
...>   sleep 5
...> done )

27912 items left
224 items left
No items left

pax> _

コンボfind/wcは、必要な単位を提供する任意のツールと交換できます。


(井戸比較的核物理学、リーマン仮説、またはクリスマスに妻に何を買うかと比較して簡単です:-)

関連情報