私たちの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
エラーが発生し、その場所はにリダイレクトされますstderr
。stdout
名前/dev/null
に特殊文字を含むファイルに対してもコマンドは失敗します。
改善されたソリューションは次のとおりです。
find /var/www/cache/blah -type f -exec rm -f -- {} +
find
POSIXlyですべての作業を実行し、フォークを最小限に抑えることがより効率的ですrm
。
答え2
コマンドラインの動作にはいくつかの違いがあります。
- コマンド
find
ラインはファイルを削除しますサブディレクトリで繰り返し、rm
コマンドラインはそうではありません。再帰が必要かどうかを検討する必要があります。 - 可能であれば、コマンドラインは
find
すべてのファイルを削除します。コマンドrm
ラインファイルをスキップできますたとえば、シェルベースの設定では、パスGLOBIGNORE
名の拡張時に一部のファイル名が誤って無視される可能性があるかどうかを考慮する必要があります。 - コマンド
find
ライン必要な数のファイルを正常に処理します。。コマンドrm
ライン失敗する可能性がありますパス名拡張子が作成された場合コマンドラインそれは長すぎる(システムがサポートするよりも大きい)。一部のシステムにはこれに制限があります。削除するファイルの数を考慮する必要があります。 - コマンド
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
-
xargs
xargs
find ... -print0 | xargs -0
find -exec command {} +
答え3
他の答えは3つのことを無視します。
絶対にこれをしないでください:
/usr/bin/find /var/www/cache/blah/ |xargs /bin/rm -f >/dev/null 2>&1
ファイルにスペースが含まれている場合、rm
両方のファイルを削除しようとすると、驚くべき結果が得られるためです。
find
GNU と を使用すると仮定し、これに固執する場合は、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
確認してください。