使用 du 时参数列表太长

使用 du 时参数列表太长

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

jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long

答案1

您可以将该命令替换为find而不是通配符并执行此操作

sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10

假设您find支持该+表示法。

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

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

答案2

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

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

最后这对我有用:

du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
  • -L在查找和大小计算中都遵循符号链接。
  • -c获取累计总数
  • <()流程替换以创建file动态
  • -print0符合du预期
  • \( \)能够-o与两个-name参数一起使用

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

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

答案3

使用最新版本的 GNU coreutils,您可以使用--max-depth选项而不是用 . 枚举文件*。这样,如果文件太多,您就不会遇到命令行长度限制的风险。没有--min-depth,因此顶级目录将列在最后。

du -x -d 1 | head -n -1 | sort -r | head -n 10

答案4

sudo ls | sudo parallel -j1 du -hsx | sort -rh | head -10

相关内容