次のようなコマンドを使用しています。
find . -name "*.php" -exec chmod 755 {} \;
私はchmodを使用していませんが、ここにはリストしない別のコマンドを使用しています。このコマンドは正常に機能しています。ただし、操作対象のファイルとディレクトリは数千あり、この操作には時間がかかります。操作が完了したときに何らかの合計を表示する方法があるのだろうか?おそらく変更されたファイルの数ですか?
私が考えることができる唯一のことは、次のようなことをすることです:
find . -name "*.php" -exec chmod 755; echo "+"; {} \;
それは機能しますか?少なくとも、何かが起こっていることがわかります...誰より良い提案がありますか?
これは動作します:
$ find . -name "*.php" -exec chmod 755 {} \; -exec /bin/echo {} \; | wc -l
これを機能させるには、2番目の-exec /bin/echo
を含める必要があります。 find
コマンドに出力がない場合、wc
には行をカウントする入力がありません。
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 '+'
find . -name "*.php" -exec chmod 755 {} + -printf '.' | wc -c
「;」の代わりに+を使用すると、findは多くのファイルで並行してchmod 755を処理しようとします。
最初のコマンドの後に追加コマンドを実行できます。ここでは、たとえばドットを印刷し、最後にドットをカウントします。
-execオプションを使用すると、findは見つかったファイルごとにサブプロセスを開始します。 find . -name '*.php' | xargs chmod 755
のようなxargsを使用すると、これを高速化できます。chmodは一度だけ起動されます。