ファイルの長さを再帰的に印刷

ファイルの長さを再帰的に印刷

ディレクトリ内のすべての* .txtファイルの長さをどのように印刷しますか?

例: ディレクトリコンテンツ:

FileA.txt 
FileB.txt
FileC.txt 
FileA.csv

*.txtの長さ:

less FileA.txt | wc -l 
43
less FileB.txt | wc -l 
13
less FileC.txt | wc -l 
3

希望の出力(出力ファイルに書き込まれます):

43
13
3

(作業中ですが成功しませんでした:ls *.txt| while read FN; do wc -l < $FN >> output; done- 空のファイルを出力しています)

答え1

wc -l -- *.txt

または、ファイル名を出力に含めたくない場合(ファイル名に改行文字が含まれていないと仮定):

wc -l -- *.txt | awk '{print $1}'

単一のシェルコマンドラインに入ることができないほど* .txtファイルが多すぎ、findがそれをサポートしていると仮定する場合-maxdepth

find . -maxdepth 1 -type f -name '*.txt' -exec wc -l {} + | 
    awk '$2 != "total" {print $1}'

(以前のファイルとは異なり、ファイルリストをソートせずに隠しファイルを含み、通常のファイルへのシンボリックリンクを含む非正規ファイルを除外します。)

もちろん、これらのいずれかの出力をファイルにリダイレクトしたり、さらに処理するために別のプログラムにパイプすることもできます。

答え2

いくつかの選択肢:

GNUの使用sed:

sed -sn '$=' ./*.txt

(空のファイル数を報告せずに、代わりにwc -l最後の改行以降の偽データを追加行として計算します。)

デフォルトでは、などのワイルドカードパターンには*.txt隠しファイルは含まれません。

GNUの使用awk:

awk 'ENDFILE{print FNR}' ./*.txt

今回は0空のファイルを受け取ります。偽データの説明はGNUと同じですsed

$ seq 10 > a.txt; : > b.txt; printf spurious > c.txt; seq 20 > .hidden.txt; echo test > $'a\n3 4.txt'
$ wc -l ./*.txt
 1 ./a
3 4.txt
10 ./a.txt
 0 ./b.txt
 0 ./c.txt
11 total
$ wc -l ./*.txt | awk '/\//{print $1}'
1
10
0
0
$ sed -ns '$=' ./*.txt
1
10
1
$ awk 'ENDFILE{print FNR}' ./*.txt
1
10
0
1

再帰的にファイル名でリストをソートするには、次を使用するか、zshksh -o globstarを使用します。bash -O globstaryash -o extended-glob

wc -l .//**/*.txt | awk '/\/\//{print $1}'
sed -ns '$=' ./**/*.txt
awk 'ENDFILE{print FNR}' ./**/*.txt

答え3

あなたはそれを使用することができますワイルドカード結合するトイレ各ファイルの行数を取得するコマンド:

wc -l *.txt

出力は次のとおりです。

13.a.txt

29b.txt

3d.txt

合計45項目

行の総数がわからない場合は、次のようにパイプできます。注文する前提は、計算するファイルが複数あることです。:

wc -l *.txt |head -n -1

ファイルではなく行数だけが必要な場合:

wc -l *.txt |head -n -1 |awk '{print $1}'

あるいは、ファイルが1つであっても複数であっても、合計数を避けるためにforループを使用できますが、これは最も醜い方法です。

for i in $(ls *.txt);do wc -l $i;done

関連情報