如何打印目录中所有*.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 文件无法容纳在单个 shell 命令行中并假设您的 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
orksh -o globstar
或bash -O globstar
or yash -o extended-glob
:
wc -l .//**/*.txt | awk '/\/\//{print $1}'
sed -ns '$=' ./**/*.txt
awk 'ENDFILE{print FNR}' ./**/*.txt