web-dev-qa-db-ja.com

-exec {}でfindを使用して、合計をカウントする方法はありますか?

次のようなコマンドを使用しています。

find . -name "*.php" -exec chmod 755 {} \;

私はchmodを使用していませんが、ここにはリストしない別のコマンドを使用しています。このコマンドは正常に機能しています。ただし、操作対象のファイルとディレクトリは数千あり、この操作には時間がかかります。操作が完了したときに何らかの合計を表示する方法があるのだろうか?おそらく変更されたファイルの数ですか?

私が考えることができる唯一のことは、次のようなことをすることです:

find . -name "*.php" -exec chmod 755; echo "+"; {} \;

それは機能しますか?少なくとも、何かが起こっていることがわかります...誰より良い提案がありますか?

35
ethanpil

これは動作します:

$ find . -name "*.php" -exec chmod 755 {} \; -exec /bin/echo {} \; | wc -l

これを機能させるには、2番目の-exec /bin/echoを含める必要があります。 findコマンドに出力がない場合、wcには行をカウントする入力がありません。

34
David W.

1つのfindコマンドで複数の-execコマンドをチェーンできます。そのための構文は次のとおりです。

find . -exec cmd1 \; -exec cmd2 \; -exec cmd3 \;

あなたの場合、これは次のようになります:

find . -name '*.php' -exec chmod 755 {} \; -exec echo '+' \;

これには他にもいくつかのオプションがありますが。出力をファイルにリダイレクトできます:

find . -name '*.php' -exec chmod 755 {} \; > logfile.txt

または、teeを使用することもできます。これにより、出力をログファイルに書き込むことができます。andは引き続き画面に出力されます。画面への継続的なストリーム出力により、コマンドがまだ実行されている(クラッシュまたはハングしていない)ことがわかり、後で参照するためのログファイルがまだあるため、これは便利です。

find . -name '*.php' -exec chmod 755 {} \; | tee logfile.txt
wc -l logfile.txt           // prints the lines in the file
grep -c '^+$' logfile.txt   // prints the lines containing a single '+'
9
Tim
find . -name "*.php" -exec chmod 755 {} + -printf '.' | wc -c

「;」の代わりに+を使用すると、findは多くのファイルで並行してchmod 755を処理しようとします。

最初のコマンドの後に追加コマンドを実行できます。ここでは、たとえばドットを印刷し、最後にドットをカウントします。

2
user unknown

-execオプションを使用すると、findは見つかったファイルごとにサブプロセスを開始します。 find . -name '*.php' | xargs chmod 755のようなxargsを使用すると、これを高速化できます。chmodは一度だけ起動されます。

0
ott--

xargs および pv を使用できます。おそらく:

find . -name "*.php" | pv --line-mode | xargs chmod 755

注:これは、*。phpファイルのパスまたは名前にスペースやその他の奇妙な文字が含まれていない場合にのみ機能します。

0
James Sumners