28

私はsedを使用して、特定の拡張子に基づいてすべての行をカウントしようとしていました。

find -name '*.m' -exec wc -l {} \; | sed ...

私は次のことをしようとしていましたが、合計を取得するためにこの特定の行にsedをどのように含めるのでしょうか。

4

8 に答える 8

55

また、wcから:を使用して適切なフォーマットを取得することもできます。

wc `find -name '*.m'`
于 2009-09-11T17:37:47.793 に答える
18

ここでの回答のほとんどは、多数のファイルではうまく機能しません。ファイル名のリストが1回のコマンドライン呼び出しに対して長すぎる場合に破損するものもあれば、-execすべてのファイルに対して新しいプロセスを開始するために非効率的なものもあります。堅牢で効率的なソリューションは次のようになると思います。

find . -type f -name "*.m" -print0 | xargs -0 cat | wc -l

この方法を使用catすると、出力が直接パイプされwc、ファイルのコンテンツのごく一部のみが一度にメモリに保持されるため、問題ありません。の1回の呼び出しに対してファイルが多すぎる場合、catcat複数回呼び出されますが、すべての出力は引き続き1つのwcプロセスにパイプされます。

于 2012-01-07T07:17:55.223 に答える
6

cat1つのインスタンスですべてのファイルwcを取得して、行の総数を取得できます。

find . -name '*.m' -exec cat {} \; | wc -l
于 2009-09-11T17:32:35.437 に答える
5

最新のGNUプラットフォームでは、wcおよびfind take -print0および-files0-fromパラメーターを組み合わせて、ファイル内の行を最後に合計でカウントするコマンドにすることができます。例:

find . -name '*.c' -type f -print0 | wc -l --files0-from=-
于 2011-06-05T07:38:05.887 に答える
4

wcの代わりに行を数えるためにsedを使用することもできます。

 find . -name '*.m' -exec sed -n '$=' {} \;

ここ'$='で、は行数を保持する「特別な変数」です

編集

sloccountのようなものを試すこともできます

于 2009-09-11T17:28:55.553 に答える
3

うーん、特に大きなファイルがたくさんある場合、猫を使った解決策は問題になるかもしれません。

私がテストしたように、2番目の解決策は合計ではなく、ファイルごとの行数だけを示します。

私はこのようなものを好みます:

find . -name '*.m' | xargs wc -l | tail -1

これにより、ファイルの数やサイズに関係なく、作業が高速になります。

于 2009-09-11T17:48:10.453 に答える
1

大きなディレクトリの場合は、次を使用する必要があります。

find . -type f -name '*.m' -exec sed -n '$=' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}' 

# alternative using awk twice
find . -type f -name '*.m' -exec awk 'END {print NR}' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}' 
于 2009-09-14T19:01:52.663 に答える
1

sedはカウントに適したツールではありません。代わりにawkを使用してください:

find . -name '*.m' -exec awk '{print NR}' {} +

\の代わりに+を使用する; (xargsのように)見つかったN個のファイルごとにawkを呼び出すように強制します。

于 2009-09-12T14:57:07.900 に答える