
タスクは、ディレクトリ内のすべてのファイルで文字「a」の出現回数を(再帰的に)見つけることでした。
私の脚本はこれです
find . -type f -exec grep -o 'a' {} \; 2>/dev/null | wc -l
しかし失敗しました。ローカル コンピューターでは動作しましたが、結果は 0 でした。
このスクリプトの何が問題なのでしょうか? おそらく、これは完全ではないのでしょう。どうすれば、これを完全または正しくできるでしょうか?
答え1
私の推測では、問題のあるマシンはgrep
-o をサポートしていません。
find
この場合、コマンド ラインはexec のたびにエラー メッセージを生成しますgrep
。ただし、標準エラーが /dev/null にリダイレクトされると、その叫びは聞き入れられません。
wc
は 1 バイトも受信せず、grep
すぐに終了するため行数は 0 になります。
stderr リダイレクトなしで、またはログ ファイルにリダイレクトしてパイプラインを実行してみてください。正しければ、 によって見つかったファイルごとに 1 つのエラー メッセージが表示されるはずですfind
。
便利だと思われる場合は、 を使用しない代替手段を次に示しますgrep
。
find . -type f -exec cat {} \; | tr -cd a | wc -m
find
より効率的な exec の代替手段をサポートしている場合+
:
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
(再帰 grep)を使用するとさらに簡略化できます。
grep -Fro 'a' "${directory-.} | wc -l
grep
残念ながら、発生回数ではなく行数をカウントするため、カウントを行うことはできませんgrep -o -c
。これはバグだと考えています。