
ディレクトリ内のすべての* .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
再帰的にファイル名でリストをソートするには、次を使用するか、zsh
次ksh -o globstar
を使用します。bash -O globstar
yash -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