仅当我在 du 命令中指定目录时出现参数列表太长错误

仅当我在 du 命令中指定目录时出现参数列表太长错误

我正在尝试计算目录中特定文件的总大小(例如/mydirectory/data/)因此,cd在这个特定目录之后,我使用以下命令:

du -c *.bin | grep total | awk '{print$1+0}'

该命令按预期工作。但是当我尝试时:

du -c /mydirectory/data/*.bin | grep total | awk '{print$1+0}'

我收到错误消息

bash: /usr/bin/du: Argument list too long

这是同一个目录,那么为什么它在第一种情况下有效,而在第二种情况下却不起作用?第二种情况是否有额外的扩展?这是完全相同的目录,具有相同数量的文件......

问题是我需要将此命令放在一个大脚本中,因此每次都进入目录然后再​​返回等bash并不方便。cd

答案1

当扩展的参数列表变得太长时,即当由作为参数给出的所有文件名组成的字符串的长度(与所有环境变量及其值的长度相结合)增长超过一定值时,就会出现“参数列表太长”错误。字节数。

您的第一个命令不会出现此错误,因为您很幸运。

您的第二个命令确实会出现此错误,因为现在每个论点还包括 string /mydirectory/data/,这意味着参数列表至少增长 18 个字节每个参数,或每 1000 个文件 18 kB。

您可以通过首先执行以下操作来解决此问题cd /mydirectory/data

( cd /mydirectory/data/ && du -c *.bin ... )

(括号表示cd仅更改该命令的当前目录,因此无需“cd后退”)

这目前可以工作,但如果您添加更多匹配的文件,仍然会中断*.bin。在这种情况下,您可能需要使用稍微复杂的方法:

find /mydirectory/data -maxdepth 1 -type f -name '*.bin' -exec du -c {} + |
awk '/total/ { sum += $1 } END { print sum }'

du在尽可能多的文件上运行尽可能在您的目录中,批量。被grep合并到awk程序中(从来没有充分的理由提供awk的输出grep),并且awk程序现在执行一个简单的求和并在最后输出。

我们需要awk程序进行求和,因为该du命令将被执行多次,生成多total行。

答案2

find /mydirectory/data -iname "*.bin" -maxdepth  1 |xargs du -c |
awk '{print $1 }'|xargs |tr " " "+" |bc

相关内容