我正在尝试计算目录中特定文件的总大小(例如/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