linux 目录中的总行数

wj8zmpe1  于 2023-10-16  发布在  Linux
关注(0)|答案(7)|浏览(111)

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

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

因为目录中有很多文件,我只想看到总数,而不是细节。有没有办法做到这一点?
我尝试了几种方法,得到了以下错误:
Argument list too long

xqnpmsa8

xqnpmsa81#

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

cat * | wc -l

这将连接当前工作目录中所有文件的内容,并通过wc -l传输生成的文本blob。
我觉得这个很优雅。请注意,该命令不会产生无关的输出。

更新:

我不知道你的目录里有这么多文件。根据这些信息,您应该尝试以下命令:

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

大多数人不知道可以将for循环的输出直接通过管道传输到另一个命令中。
注意,这可能会非常慢。如果你有10万个左右的文件,我猜大约需要10分钟。这是一个大胆的猜测,因为它取决于我无法检查的几个参数。
如果你需要更快的东西,你应该用C编写自己的实用程序。如果你使用pthreads,你可以让它出奇的快。
希望能帮上忙。

最后一条:

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

8cdiaqws

8cdiaqws2#

功劳:这是建立在@lifecrisis的答案之上的,并将其扩展到处理 * 大量 * 文件:

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

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

bzzcjhmw

bzzcjhmw3#

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

这将是一个有趣的比较,以找出有多少行不以一个新的行结束。
结合awk和Gordon的查找解决方案,避免“.”文件。

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

不知道这是更好还是更坏,但它确实给出了给予更准确的计数(对我来说),并且不计算“.”文件中的行。使用./* 只是一个猜测,似乎是有效的。
仍然需要深度,./* 需要“0”深度。
我使用“cat”和“awk”解决方案得到了相同的结果(使用相同的find),因为“cat *”解决了新行的问题。我没有足够的文件目录来测量时间。有趣,我喜欢“猫”的解决方案。

vecaoik1

vecaoik14#

这将给予您当前目录中所有文件(包括隐藏文件)的总数:

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

要对不包括隐藏文件的文件进行计数,用途:

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

ttp71kqs5#

(很抱歉把这个作为一个答案,但我没有足够的声誉来评论。
@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
6ljaweal

6ljaweal6#

如果只想知道目录中的总行数,不包括总行数

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

前面的注解将给予总行数,其中仅包括所有文件中的行数

pxiryf3j

pxiryf3j7#

下面的命令将提供路径中所有文件的总行数

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

相关问题