目录中的总行数

时间:2017-10-31 01:17:32

标签: linux bash command-line scripting

我有一个包含数千个文件的目录(现在为100K)。当我使用wc -l ./*时,我会得到:

 c1            ./test1.txt
 c2            ./test2.txt
 ...
 cn            ./testn.txt
 c1+c2+...+cn  total

因为目录中有很多文件,我只想查看总计数而不是详细信息。有没有办法这样做?

我尝试了几种方法,我得到了以下错误:
Argument list too long

7 个答案:

答案 0 :(得分:4)

如果您想要的是总行数而不是其他内容,那么我建议使用以下命令:

cat * | wc -l

catenates当前工作目录中所有文件的内容,并通过wc -l管理生成的文本blob。

我觉得这很优雅。请注意,该命令不会产生任何无关的输出。

<强>更新

我没有意识到你的目录包含这么多文件。根据这些信息,您应该尝试以下命令:

for file in *; do cat "$file"; done | wc -l

大多数人都不知道你可以将for循环的输出直接传递给另一个命令。

请注意,这可能非常慢。如果您有大约100,000个文件,我的猜测大概是10分钟。这是一个疯狂的猜测,因为它取决于我无法检查的几个参数。

如果你需要更快的东西,你应该在C中编写自己的实用程序。如果使用pthreads,你可以惊人的速度。

希望有所帮助。

最后注意:

如果您对构建自定义实用程序感兴趣,我可以帮助您编写代码。这将是一个很好的练习,其他人可能会发现它很有用。

答案 1 :(得分:1)

awk 'END {print NR" total"}' ./*

这将是一个有趣的比较,以找出多少行不以新行结束。

结合awk和Gordon找到解决方案并避免使用“。”文件。

find ./* -maxdepth 0 -type f -exec awk ‘END {print NR}’ {} +

不知道这是好还是坏,但它确实给出了更准确的计数(对我而言)并且不计算“。”文件中的行数。使用./*只是猜测似乎有效。

仍然需要深度,而./*需要“0”深度。

我确实得到了与“cat”和“awk”解决方案(使用相同的查找)相同的结果,因为“cat *”负责新的行问题。我没有足够的文件来测量时间。有意思,我喜欢“猫”解决方案。

答案 2 :(得分:1)

信用:这建立在@lifecrisis的答案之上,并将其扩展为处理大型数量的文件:

find . -maxdepth 1 -type f -exec cat {} + | wc -l

find将找到当前目录中的所有文件,将它们分成可以作为参数传递的大小组,并在组上运行cat

答案 3 :(得分:1)

(很抱歉将其添加为答案,但我没有足够的声誉进行评论。)

评论@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

答案 4 :(得分:0)

下面的命令将提供路径

中所有文件的总行数
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

答案 5 :(得分:0)

iF您只想知道目录中的总行数,不包括总行数

ls -ltr | sed -n '/total/!p' | awk '{print NR}'

以前的评论会给出总行数,其中只包括所有档案中的行数

答案 6 :(得分:0)

这将为您提供当前目录中所有文件(包括隐藏文件)的总计数:

$ find . -maxdepth 1 -type f  | xargs wc -l  | grep total
 1052 total

要计算不包含隐藏文件的文件,请使用:

find . -maxdepth 1 -type f  -not -path "*/\.*"  | xargs wc -l  | grep total