使用 du 时参数列表太长

Joe*_*ith 5 shell disk-usage sort

我有一个命令可以在特定文件夹中查找大文件,但由于某种原因,它在某些情况下不起作用,并且出现“参数列表太长”错误。如何修复此命令以使其每次都有效?

jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long
Run Code Online (Sandbox Code Playgroud)

Eri*_*ouf 6

你可以用find代替 globbing替换该命令并执行它

sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10
Run Code Online (Sandbox Code Playgroud)

假设您find支持该+符号。

这将查找当前目录下的所有内容而不进行更深入的查找,并忽略“.”。(感谢@rudimeier 的提醒!)

这将包括当前目录中的所有文件,就像您最初拥有的 glob 一样。与那个 glob 不同的是,这也会找到以 开头的文件.(除非你已经在使用 shell 选项来启用dotglob)。


uno*_*ode 5

我在寻找一种方法来处理“参数列表太长”时遇到了这个问题du。在我的情况下,我不想过滤输出,而是获得与模式匹配的所有文件的总数。使用其他问题中的方法,我无法得到总计,因为他们最终会du用一个参数子集调用多次。

解决方案是使用--files0-from=而不是将文件名作为参数传递。

最后这对我有用:

du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
Run Code Online (Sandbox Code Playgroud)
  • -L 在查找和大小计算中遵循符号链接。
  • -c 得到累计总数
  • <()进程替换创建file上飞
  • -print0符合du预期
  • \( \)能够-o与两个-name参数一起使用

同样,上述问题的答案可能是:

du -hsx --files0-from=<(find -maxdepth 1 ! -name "." -print0) | sort -rh | head -10
Run Code Online (Sandbox Code Playgroud)