現在、次のコマンドを使用して、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を使用してシェルスクリプトを再生成してオーバーヘッドを減らしてください。