findコマンドの各結果に対してwcをどのように実行しますか?

findコマンドの各結果に対してwcをどのように実行しますか?

このコマンドを使用して、見つかった各ファイルに数行があることを確認したいと思いますfind

私はこれを使用してwc -l単一のファイルの行番号を見つけることができることを知っています。ただし、次の出力でパイプするときは機能しませんfind

find -type f -name package.json | wc -l

これにより、見つかったファイルの数が返されます。見つかった各ファイルの行数を返したいです。

答え1

wcwバイト/文字/コマンド/行数を含むcファイルのリストを取得します。議論

引数なしで呼び出されると、標準入力はこれらのバイト/文字/単語/行を報告します。したがって、 にパイプすると、 のfind出力wc -lから改行数が得られるので、findこれは見つかったファイル数にそのパスの改行数を加えた値になります。

GNU実装では、wcこのオプションを使用してファイルからNULで区切られたファイルのリストを取得することもできます--files0-from。これは-stdinというファイルの代わりにstdinを意味すると見なされるため、-次のことができます。

find . -name package.json -type f -print0 |
  wc -l --files0-from=-

標準findまたは実装を使用してファイルパスのリストを渡すwcことができます。findパラメータとしてそしてwc

find . -name package.json -type f -exec wc -l {} +

ただし、一致するファイルが多いとwc複数回実行され、行が複数回表示されることがありますtotal

wctotalこの行は、処理するファイルが2つ以上提供されている場合に印刷されるため、この行をスキップtotalするには、次のようにします。

find . -name package.json -type f -exec wc -l {} ';'

プロセスを分岐し、各ファイルに対してコマンドを実行するのに費用がかかるため、これは非常に非効率的です。

これが本当に興味のある合計であれば、次のようにします。

find . -name package.json -type f -exec cat {} + | wc -l

我々はcatこれらのファイルの内容へのリンクをに提供しますwc

zshとanyを使用すると、wc次のことができます。

wc -l -- **/package.json(D.)

(otglobの場合、dosのように非表示にすることDも、次の内容のみを含めることもできます。Dfind.定期的な対応するファイル-type f)。

これはソートされたリストを提供し、接頭辞を避けることができるという利点があります./

今回は、一致するファイルがないか多すぎるとエラーが発生します。

GNUを使用すると、duNULで区切られたglob拡張を次のように渡すことで、これらの問題を回避できますwc -l --files0-from=-

print -rNC1 -- **/package.json(ND.) | wc -l --files0-from=-

また、json形式では改行(重要wc -l)は重要ではないので、これが有用な指標であるかどうかはわかりません。

たとえば、次のファイルの一部の配列にある要素の数を代わりに返すことができます。

find . -name package.json -type f -exec \
  jq -r '[.devDependencies|length,input_filename]|@csv' {} +

(ファイルパスがUTF-8でエンコードされたテキストであると仮定すると、結果はCSV形式でここに提供されます。)

答え2

xargs以下を使用して、標準入力を必須引数ベクトルにパイプすることができます。

find -type f -name package.json | xargs wc -l

または、単にシェルコマンドの置き換えでそれを埋めるようにしてください。

wc -l $(find -type f -name package.json)

関連情報