要打印当前文件夹的所有“.txt”文件中的行数,我使用以下脚本:
for f in *.txt;
do l="$(wc -l "$f")";
echo "$f" has "$l" lines;
done
但是在输出中我得到了:
lol.txt has 2 lol.txt lines
为什么lol.txt
打印两次(特别是在2之后)?我想有一些流刷新需要,但我不知道在这种情况下如何实现。所以我应该在脚本中做出什么改变以获得输出:
lol.txt has 2 lines
答案 0 :(得分:1)
文件名被打印两次,因为wc -l "$f"
也会在行数之后打印文件名。尝试将其更改为cat "$f" | wc -l
。
答案 1 :(得分: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
答案 2 :(得分:1)
您可以使用'cut'删除文件名:
for f in *.txt;
do l="$(wc -l "$f" | cut -f1 -d' ')";
echo "$f" has "$l" lines;
done
答案 3 :(得分:1)
这里有一个技巧。获取wc读取stdin,它不会打印文件名:
for f in *.txt; do
l=$(wc -l < "$f")
echo "$f" has "$l" lines
done