ファイルシステムツリーの文字発生回数を計算します。

ファイルシステムツリーの文字発生回数を計算します。

タスクは、ディレクトリ内のすべてのファイルに文字「a」が表示される回数を(再帰的に)見つけることです。

私のスクリプトは次のとおりです

find . -type f -exec grep -o 'a' {} \; 2>/dev/null | wc -l

しかし、失敗します。私のローカルコンピュータでも動作し、結果は0です。

このスクリプトにはどのような問題がありますか?防弾やそんなことではないようです。どのように防弾するか、正しく作成できますか?

答え1

私の考えでは、問題のコンピュータがgrep-oをサポートしていないようです。

この場合、コマンドラインはfind実行するたびにエラーメッセージを生成しますgrep。しかし、標準エラーが/dev/nullにリダイレクトされ、人々の悲鳴は耳に聞こえなくなりました。

wcgrepシングルバイトが受信されずすぐに終了したため、行数は0になります。

stderrリダイレクトやログファイルにリダイレクトせずにパイプラインを実行してみてください。私が正しい場合は、見つかったファイルごとに1つのエラーメッセージが表示されますfind

役に立つと思われるとうまくいかない選択肢は次のとおりですgrep

find . -type f -exec cat {} \; | tr -cd a | wc -m

findより効率的な+実行代替をサポートする場合:

find . -type f -exec cat {} + | tr -cd a | wc -m

答え2

私はこれをしました:

find "${directory-.}" -type f -print0 | xargs -0 -r cat | grep -F -o 'a' | wc -l

これはコマンドとほぼ同じで、ゼロ以外の結果を得ます。あなたが思うディレクトリにありますか?本当に探していますaか?それ以外の場合grep -F(使用している場合)、fgrep正規表現の代わりに固定文字列を検索することをお勧めします。

grep -r(recursive grep)を使用すると、さらに簡素化できます。

grep -Fro 'a' "${directory-.} | wc -l

grep残念ながら、発生回数ではなく行が計算されるため、計算を実行できませんgrep -o -c。これはバグだと思います。

関連情報