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