目录中的总行数

Sha*_*nam 2 linux bash scripting command-line

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

 c1            ./test1.txt
 c2            ./test2.txt
 ...
 cn            ./testn.txt
 c1+c2+...+cn  total
Run Code Online (Sandbox Code Playgroud)

因为目录中有很多文件,所以我只想查看总数而不是详细信息。有什么办法吗?

我尝试了几种方法,但出现以下错误:
Argument list too long

lif*_*sis 5

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

cat * | wc -l
Run Code Online (Sandbox Code Playgroud)

这将填充当前工作目录中所有文件的内容,并将产生的文本斑点通过管道传输wc -l

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

更新:

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

for file in *; do cat "$file"; done | wc -l
Run Code Online (Sandbox Code Playgroud)

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

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

如果您需要更快的速度,则应使用C编写自己的实用程序。如果使用pthreads,则可以使其速度惊人地快。

希望能有所帮助。

最后说明:

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


Gor*_*son 5

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

find . -maxdepth 1 -type f -exec cat {} + | wc -l
Run Code Online (Sandbox Code Playgroud)

find将查找当前目录中的所有文件,将它们分成尽可能大的组作为参数传递,然后cat在组上运行。

  • @lifecrisis 是的,这是“find”的一个方便的功能。请注意,“-exec cmd {} +”将批量运行文件,而“-exec cmd \;”将一次运行一个文件。`+` 行为与 `xargs` 非常相似。 (2认同)