/bin/cat: 参数列表太长

Mil*_*one 5 linux shell-script cat

我在一个文件夹中有 119766 个文件。它们是 CSV 文件。我想找出所有文件的总行数。

我正在尝试运行以下命令:

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

但是出现以下错误:

-bash: /bin/cat: 参数列表太长

我怎样才能做到这一点?有没有办法解决?

我想补充的一件事是总行数会非常大。

Dub*_*ubu 7

好吧,cat从问题中给出一个新家,应该这样做:

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

它一次又一次地cat使用最大可接受数量的文件名 ( +)执行 a并将所有内容通过管道传输到wc. 如果您不想遍历子目录,-maxdepth 1则必须将 a 添加到 find 命令中,在目录之后。

作为替代方案,可以使用--files0-fromGNU 选项wc

find . -type f -print0 | wc -l --files0-from=- | tail -1
Run Code Online (Sandbox Code Playgroud)

此选项使wc读取的不是内容而是来自标准输入的文件名,由空字符分隔。使用-print0,find将打印那些以空字节分隔的文件名。由于wc仍会打印出每个文件的行数,因此建议跳过最后的摘要行以外的所有内容,因此tail.

这两种解决方案的优点是它们可以在任何语言环境中工作,而@cas 的解决方案必须进行调整(例如,'total' 在德语中是 'insgesamt')。


cas*_*cas 5

如果您想要每个文件的行数:

find . -type f -exec wc -l {} + | awk '! /^[ 0-9]+[[:space:]]+total$/'
Run Code Online (Sandbox Code Playgroud)

我已经排除了总行数,因为将有几个正在处理这么多文件。该find ... -exec ... +会尽量满足尽可能多的文件名到一个单一的命令行成为可能,但会有很多小于119766页的文件....大概只有几千个(最多)每调用wc,而且每一个将导致其自身独立的“总”线。

如果您想要合并所有文件中的总行数,这是一种方法:

find . -type f -exec wc -l {} + | 
    awk '/^[ 0-9]+[[:space:]]+total$/ {print $1}' | 
    xargs | sed -e 's/ /+/g' | bc
Run Code Online (Sandbox Code Playgroud)

这仅打印总行上的行数,将其输入xargs以获取一行中的所有计数,然后 sed 将空格转换为+符号,然后将批次输入bc以进行计算。

示例输出:

$ cd /usr/share/doc
$ find . -type f -exec wc -l {} + | 
    awk '/^[ 0-9]+[[:space:]]+total$/ {print $1}' | 
    xargs | sed -e 's/ /+/g' | bc 
53358931
Run Code Online (Sandbox Code Playgroud)