递归打印文件长度

递归打印文件长度

如何打印目录中所有*.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

递归地,如果您想要按文件名排序的列表,请使用zshorksh -o globstarbash -O globstaror 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}'

或者,您可以尝试使用 for 循环来避免总计数,无论是有一个文件还是多个文件,但这是最丑陋的方式:

for i in $(ls *.txt);do wc -l $i;done

相关内容