0

現在のフォルダーのすべての「.txt」ファイルの行数を出力するには、次のスクリプトを使用しています。

for f in *.txt;
do l="$(wc -l "$f")";
echo "$f" has "$l" lines;
done 

しかし、出力で私は得ています:

lol.txt has 2 lol.txt lines

なぜlol.txt2 回 (特に 2 回目以降) 印刷されるのですか? ある種のストリームフラッシュが必要だと思いますが、この場合それを達成する方法がわかりません。出力を次のように取得するには、スクリプトにどのような変更を加える必要がありますか:

lol.txt has 2 lines
4

4 に答える 4

1

ここにトリックがあります。wcにstdinを読み取らせると、ファイル名が出力されません。

for f in *.txt; do
    l=$(wc -l < "$f")
    echo "$f" has "$l" lines
done
于 2012-05-30T22:34:40.067 に答える
1

wc -l "$f"行数の後にファイル名も出力されるため、ファイル名は 2 回出力されます。に変更してみてくださいcat "$f" | wc -l

于 2012-05-30T14:14:52.663 に答える
1

wcファイル名を出力するので、スクリプトを次のように記述できます。

ls *.txt | while read f; do wc -l "$f"; done

または、本当に詳細な出力が必要な場合は、試してください

ls *.txt | while read f; do wc -l "$f" | awk '{print $2, "has", $1, "lines"}'; done
于 2012-05-30T14:19:53.867 に答える
1

「カット」でファイル名を削除できます。

for f in *.txt;
do l="$(wc -l "$f" | cut -f1 -d' ')";
echo "$f" has "$l" lines;
done 
于 2012-05-30T14:27:09.247 に答える