ファイルを削除するための短いコマンド

ファイルを削除するための短いコマンド

私たちのWebサーバーはもともと他の会社によって維持されていました。彼らはキャッシュファイルをクリーンアップするための短いスクリプトを書いた。そのファイルには次のような数行があります。

/usr/bin/find /var/www/cache/blah/ |xargs /bin/rm -f >/dev/null 2>&1

ただ書けない理由がありますか?

/bin/rm -f /var/www/cache/blah/*

ファイルを削除?特定の標準が必要なときに使用していることがわかりますが、findこの場合は見つからないようです。

答え1

find+を使用する理由を考えてみましょうxargs

  • キャッシュされたファイルが多すぎる場合を処理します。これはrm、1つのコマンドのみを実行するとエラーになります。

  • ワイルドカードは*隠しファイルを拡張しません。

  • 再帰的に作業します。

ただし、このfind+はxargsフィルタを追加しないとfind結果にディレクトリとファイルが含まれているため効率的ではありません。ディレクトリで実行すると/bin/rm -fエラーが発生し、その場所はにリダイレクトされますstderrstdout名前/dev/nullに特殊文字を含むファイルに対してもコマンドは失敗します。

改善されたソリューションは次のとおりです。

find /var/www/cache/blah -type f -exec rm -f -- {} +

findPOSIXlyですべての作業を実行し、フォークを最小限に抑えることがより効率的ですrm

答え2

コマンドラインの動作にはいくつかの違いがあります。

  1. コマンドfindラインはファイルを削除しますサブディレクトリで繰り返しrmコマンドラインはそうではありません。再帰が必要かどうかを検討する必要があります。
  2. 可能であれば、コマンドラインはfindすべてのファイルを削除します。コマンドrmラインファイルをスキップできますたとえば、シェルベースの設定では、パスGLOBIGNORE名の拡張時に一部のファイル名が誤って無視される可能性があるかどうかを考慮する必要があります。
  3. コマンドfindライン必要な数のファイルを正常に処理します。。コマンドrmライン失敗する可能性がありますパス名拡張子が作成された場合コマンドラインそれは長すぎる(システムがサポートするよりも大きい)。一部のシステムにはこれに制限があります。削除するファイルの数を考慮する必要があります。
  4. コマンドfindラインはすべての出力メッセージを無視します(redirect toを使用>/dev/null)。コマンドラインからrm出力メッセージを印刷します。メッセージがどうなるかを考慮する必要があります。

これらの違いがあなたにとって重要でない場合は、そう/bin/rm -f /var/www/cache/blah/*なります。

ファイルだけを削除してディレクトリを保持する場合は、実際に使用します。

/usr/bin/find /var/www/cache/blah/ -not -type d -exec /bin/rm -f -- {} + >/dev/null 2>&1

または

/usr/bin/find /var/www/cache/blah/ -type f -exec /bin/rm -f -- {} + >/dev/null 2>&1

あなたの目的に合うものが何であれ、どちらにも長所と短所があります。

-exec command {} +同様に動作しますxargsが、やや効率的です。ファイル名のいずれ--か。スペースなどの特殊文字は、実際には単純な呼び出しを中断する可能性があります。似たようなものが必要な場合ははるかに簡単です。rm-xargsxargsfind ... -print0 | xargs -0find -exec command {} +

答え3

他の答えは3つのことを無視します。

絶対にこれをしないでください:

/usr/bin/find /var/www/cache/blah/ |xargs /bin/rm -f >/dev/null 2>&1

ファイルにスペースが含まれている場合、rm両方のファイルを削除しようとすると、驚くべき結果が得られるためです。

findGNU と を使用すると仮定し、これに固執する場合は、xargs次のことを行う必要があります。

/usr/bin/find /var/www/cache/blah/ -print0 | xargs -0 /bin/rm -f >/dev/null 2>&1

ここで、0はファイルを終了します(xargsでは0の終了が予想されます)。

第二に、ディレクトリを削除してみましたか?そうでない場合は「-type f」が必要です。その場合、rm -rf がrmなければ-rディレクトリは削除されないので、rm -rf が必要です。

しかし、結論は、OPがより短いアプローチを要求し、答えが長く見えるということです。どうですか?

/usr/bin/find /var/www/cache/blah/ -delete

私は-deleteこれがGNU拡張だと思うので、あなたのバージョンがそれをサポートしていることをfind確認してください。

関連情報