テスト並列化によるfind rmコマンドの速度向上

テスト並列化によるfind rmコマンドの速度向上

現在、次のコマンドを使用して、10行未満のディレクトリとサブディレクトリのすべてのファイルを繰り返し削除したいと思います。

find . -type f -name "*.txt" | while read; do     
(($(cat $THISFILE | wc -l) < 10)) && rm -vf "$THISFILE"; done 

findいくつかのコマンドを並列化するためにwithを使用しましたが、xargsここではwith行でテストした後に何をすべきかわかりません。wc -l

ありますか?ないか!どうすればより速くすることができますかxargs

ベストアンサー1

(私が知っている限り)検索自体は並列に実行することはできません。

xargsはこれを行うことができ、xargsを使用してこれを行う最も簡単な方法はシェルスクリプトでラップすることです。

しかし、そうする前に状況を最適化する必要があります。catファイルが実際に接続されていない場合は役に立ちません。ファイルに10行以上があることを確認するために、すべての行をセルする必要はありません。だから私は次の条件を提案します。

[ $(head -n 10 "$file" | wc -l) -lt 10 ] && echo rm "$file"

最初の10行まで読み込み、ファイルが多い場合は削除します(rmは少し危険であるため、最初にechoテストできるように追加しました)。 catとは異なり、headは実際に10行に達すると読み取りを中止するため、ディレクトリ内のファイルが10行より長いとプロセスが大幅に高速になります。

次のようにシェルスクリプトで包みます。

#!/bin/bash

for file in "$@"
do
    [ $(head -n 10 "$file" | wc -l) -lt 10 ] && echo rm "$file"
done

複数の処理には find+xargs を使用できます。

find . -type f -name "*.txt" -print0 | xargs -0 -P 4 -n 8 ./rm10lines.sh

(プロセス4つ-P 4)と-n 8(シェルスクリプト呼び出しあたり8つの引数)は例ですので、必要に応じて調整してください。ファイルが多いことがわかっている場合は、より大きな-nを使用してシェルスクリプトを再生成してオーバーヘッドを減らしてください。

おすすめ記事