wc -l ./*
命令时,会得到以下结果: c1 ./test1.txt
c2 ./test2.txt
...
cn ./testn.txt
c1+c2+...+cn total
由于目录中有很多文件,我只想看到总数而不是详细信息。有没有办法这样做?
我尝试了几种方法,但出现了如下错误:
参数列表太长
wc -l ./*
命令时,会得到以下结果: c1 ./test1.txt
c2 ./test2.txt
...
cn ./testn.txt
c1+c2+...+cn total
由于目录中有很多文件,我只想看到总数而不是详细信息。有没有办法这样做?
我尝试了几种方法,但出现了如下错误:
参数列表太长
cat * | wc -l
wc -l
将结果文本块传输。
我觉得这个命令非常优雅。请注意,该命令不会产生任何多余的输出。
更新:
我没有意识到你的目录中有这么多文件。鉴于这个信息,你应该尝试这个命令:
for file in *; do cat "$file"; done | wc -l
for
循环的输出直接传递给另一个命令。cat *
无法捕获隐藏(点)文件。cat * .[^.]*
可以获取两者。 - David C. Rankin致谢:这基于@lifecrisis的答案,并对其进行扩展以处理大量文件:
find . -maxdepth 1 -type f -exec cat {} + | wc -l
find
命令可以在当前目录中查找所有文件,将它们分组,并尝试将尽可能多的文件作为参数传递给 cat
命令进行处理。
find
的一个方便功能。请注意,-exec cmd {} +
会批处理运行文件,而-exec cmd \;
会逐个运行它们。+
的行为非常类似于xargs
。 - Gordon Davissonawk 'END {print NR" total"}' ./*
要进行一项有趣的比较,了解有多少行没有以换行符结尾。
将awk和Gordon的find方案结合起来,避免"."文件。
find ./* -maxdepth 0 -type f -exec awk 'END {print NR}' {} +
我不知道这样做是好还是坏,但它确实提供了更准确的计数(对我而言),并且不会计算“.”文件中的行。使用“./ *”只是一个似乎有效的猜测。
仍然需要深度,“./ *”需要“0”深度。
我用“cat”和“awk”解决方案得到了相同的结果(使用相同的查找方式),因为“cat *”处理了换行符问题。我没有一个有足够多文件的目录来测量时间。有趣的是,我喜欢“cat”解决方案。
$ find . -maxdepth 1 -type f | xargs wc -l | grep total
1052 total
要计算不包括隐藏文件的文件,请使用:
find . -maxdepth 1 -type f -not -path "*/\.*" | xargs wc -l | grep total
-not -path "*/\.*"
来排除当前目录中的隐藏文件。请查看更新后的答案。 - Rahul Verma很抱歉以回答的形式添加此内容,但我没有足够的声望来发表评论。
关于@lifecrisis的答案的评论。也许cat
会稍微减慢速度。我们可以用wc -l
替换cat,然后使用awk
添加数字。(这可能会更快,因为需要通过管道传输的数据要少得多。)
就是这样
for file in *; do wc -l "$file"; done | awk '{sum += $1} END {print sum}'
for file in *; do cat "$file"; done | wc -l
(免责声明: 我没有采纳其他答案中的许多改进,但我认为这个观点足够重要,值得写下来。)
以下是我的结果供比较(我先运行了更新的版本,以便任何缓存效应都会对新的候选者产生影响)。
$ time for f in `seq 1 1500`; do head -c 5M </dev/urandom >myfile-$f |sed -e 's/\(................\)/\1\n/g'; done
real 0m50.360s
user 0m4.040s
sys 0m49.489s
$ time for file in myfile-*; do wc -l "$file"; done | awk '{sum += $1} END {print sum}'
30714902
real 0m3.455s
user 0m2.093s
sys 0m1.515s
$ time for file in myfile-*; do cat "$file"; done | wc -l
30714902
real 0m4.481s
user 0m2.544s
sys 0m4.312s
以下命令将提供路径中所有文件的行总数
for i in `ls- ltr | awk ‘$1~”^-rw”{print $9}’`; do wc -l $I | awk ‘{print $1}’; done >>/var/tmp/filelinescount.txt
Cat /var/tmp/filelinescount.txt| sed -r “s/\s+//g”|tr “\n” “+”| sed “s:+$::g”| sed ’s/^/“/g’| sed ’s/$/“/g’ | awk ‘{print “echo” “ “ $0”+bc”}’| sh
如果你只想知道目录中总行数(不包括空行),可以使用以下命令:
ls -ltr | sed -n '/total/!p' | awk '{print NR}'
前面的评论将给出总行数,其中仅包括所有文件中的行数
ls -l | wc -l
。 - Guestc1+c2+...+cn
。 - Shannon