Mil*_*one 5 linux shell-script cat
我在一个文件夹中有 119766 个文件。它们是 CSV 文件。我想找出所有文件的总行数。
我正在尝试运行以下命令:
cat * |wc -l
Run Code Online (Sandbox Code Playgroud)
但是出现以下错误:
-bash: /bin/cat: 参数列表太长
我怎样才能做到这一点?有没有办法解决?
我想补充的一件事是总行数会非常大。
好吧,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')。
如果您想要每个文件的行数:
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)
| 归档时间: |
|
| 查看次数: |
12736 次 |
| 最近记录: |