web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルの行数を人間が読める形式でどのようにリストしますか。

大きなcsvファイルを含むディレクトリとサブディレクトリのリストがあります。これらのファイルには約5億行あり、それぞれがレコードです。私が知りたいのですが

  1. 各ファイルの行数。
  2. ディレクトリに何行あるか。
  3. 合計行数

最も重要なのは、これを「人間が読める形式」で必要とすることです。 12345678ではなく12,345,678

これを3つの方法で行う方法を学ぶのは良いことです。プレーンバニラbashツール、awkなど、Perl(またはpython)。

46
Hexatonic

各ファイルの行数。

wcを使用してください。元々は単語数をカウントするためだと思いますが、行、単語、文字、バイト、および最長の行の長さを実行できます。 -lオプションは、行を数えるように指示します。

wc -l <filename>

これは行数を出力します:

$ wc -l /dir/file.txt
32724 /dir/file.txt

データをwcにパイプすることもできます。

$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63

ディレクトリに何行あるか。

試してください:

find . -name '*.pl' | xargs wc -l

別のワンライナー:

( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l

ところで、wcコマンドは、行ではなく新しい行コードをカウントします。ファイルの最後の行が新しい行コードで終わっていない場合、これはカウントされません。

完全な例であるgrep -c ^を使用できます。

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another Shell
done
echo TOTAL LINES COUNTED:  $total

合計行数

あなたが正しくリクエストしたことを私が理解したかどうかはわかりません。例えばこれにより、各ファイルの行数を示す次の形式で結果が出力されます。

# wc -l `find /path/to/directory/ -type f`
 103 /dir/a.php
 378 /dir/b/c.xml
 132 /dir/d/e.xml
 613 total

または、次のコマンドにファイルごとのカウントなしで改行文字の総数のみを出力することは、有用であると証明できます。

# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
 613

最も重要なのは、これを「人間が読める形式」で必要とすることです。 12345678ではなく12,345,678

Bashには printf 関数が組み込まれています。

printf "%0.2f\n" $T

いつものように、ここで述べた同じ結果を達成するために使用できる多くの異なる方法があります。

66
malyy

多くの場合、wcコマンドとワイルドカード*を組み合わせれば十分です。
すべてのファイルが1つのディレクトリにある場合は、次のように呼び出すことができます。

wc -l src/*

複数のファイルとディレクトリを一覧表示することもできます。

wc -l file.txt readme src/* include/*

このコマンドは、ファイルとその行数のリストを表示します。
最後の行は、すべてのファイルの行の合計になります。


ディレクトリ内のすべてのファイルを再帰的にカウントするには:

最初に、shopt -s globstarを.bash_profileに追加して、globstarを有効にします。 globstarのサポートには、必要に応じてbrew install bashでインストールできるBash≥4.xが必要です。バージョンはbash --versionで確認できます。

次に実行します:

wc -l **/*

Globstarが有効になっていない場合、この出力は正しくないことに注意してください。

14
Thomio

このコマンドは、各ディレクトリの行コードのリストを提供します:

find . -name '*.*' -type f | xargs wc -l
3
Suresh.A

ゲームには少し遅れましたが、dirのサイズが原因で、上記の引数エラーがたくさん発生しました。これは私のために働きました:

for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt

2
Ron Paulfan

catはファイルを1つに結合し、すべてを標準出力に出力します。wc -lディレクトリ内のファイルの行数の合計について:

cat /path/to/directory/* | wc -l
1
picmate 涅

@malyyの回答を次のように拡張します(コメントを大きくする)。

合計行数

多くの答えは、wcコマンドラインファイルオプションをxargsとともに使用しています。これに関する問題は、xargsがかなり小さいプラットフォーム依存サイズに制限されていることです。

さらに、BSD(macOS)とGNU(linux/homebrew)wcの間には違いがあります。

GNU oneは、引数(--files0)。

Macを使用していて自作がある場合は、次のことを行う必要があります。

find . -name "*.pl" -print0 | gwc -l --files0=-

wcの代わりにgwcに注意

1
Adam Gent