为了打印当前文件夹的所有“.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
文件名被打印两次,因为wc -l "$f"
也在行数之后打印文件名。尝试将其更改为cat "$f" | wc -l
.
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
您可以使用 'cut' 删除文件名:
for f in *.txt;
do l="$(wc -l "$f" | cut -f1 -d' ')";
echo "$f" has "$l" lines;
done
这里有个窍门。让 wc 读取标准输入,它不会打印文件名:
for f in *.txt; do
l=$(wc -l < "$f")
echo "$f" has "$l" lines
done