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
如果您想要的是总行数,而不是其他所有内容,那么我建议使用以下命令:
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,则可以使其速度惊人地快。
希望能有所帮助。
最后说明:
如果您有兴趣构建自定义实用程序,我可以帮助您编写一个。这将是一个很好的练习,其他人可能会发现它很有用。
信用:这建立在@lifecrisis的答案之上,并将其扩展为处理大量文件:
find . -maxdepth 1 -type f -exec cat {} + | wc -l
Run Code Online (Sandbox Code Playgroud)
find将查找当前目录中的所有文件,将它们分成尽可能大的组作为参数传递,然后cat在组上运行。