Oracle Linux 6.7 -bash:/usr/bin/du:参数列表太长

Oracle Linux 6.7 -bash:/usr/bin/du:参数列表太长

我有一个大约 100 万个文件夹的路径,总大小为 300GB。当我运行该du -sh *命令时,出现标题中提到的错误。我如何结合使用xargs此命令或将xargs解决我的问题?但是,我仍然需要一个单独的命令来查找同一路径下大于 20GB 的文件夹。需要帮助才能使用这两个命令。

路径示例:/data/dataold/exports/

输出应如下所示(您可以将我在下面所说的内容视为我在上一行指定的主路径下的文件和文件夹名称):

4.0K xyz.sh
12K asdasda.txt
10G QWERT
1G ASDFGH

此致。

答案1

一种选择是使用find,但我建议使用如下所示的其他解决方案之一。

find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \;

假设/data/dataold/exports包含子目录

foo
bar
baz

(也许更多),它将运行

du -sh /data/dataold/exports/foo
du -sh /data/dataold/exports/bar
du -sh /data/dataold/exports/baz

ETC。

选项-mindepth避免运行du命令 for /data/dataold/exports,并-maxdepth避免对子目录的子目录运行命令,例如 for /data/dataold/exports/foo/something

正如建议的CAS' 评论,你可以使用

find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \+

而不是... -exec du -sh {} \;,如果您的版本find支持此功能。使用+代替;,每次 linux arg 缓冲区被填满(大约 2MB)时find都会执行一次,而不是为每个文件/目录执行一次。du前者是很多快点。

引用斯蒂芬·查泽拉斯' 注释:“请注意,如果这些顶级目录之间存在硬链接,则调用多个独立的调用du(例如 with )可能会给出不同的数字,因为如果通过不同的调用找到它们,则不会对它们进行重复数据删除。”find -execdu


使用 GNU,您可以使用选项或 来du限制要显示的深度:-d--max-depth=N

du -h -d 1 /data/dataold/exports

这将对所有子目录进行计算,但将输出限制为起点以下的深度 1,因此在上面显示的示例中,它应该打印总大小

/data/dataold/exports/foo
/data/dataold/exports/bar
/data/dataold/exports/baz

等等以及对于

/data/dataold/exports

第二种解决方案(如果可用)应该是首选,因为它不需要du为每个子目录(在 的情况下-exec ... \;)或填充参数缓冲区的每组子目录(在 的情况下-exec ... \+)启动新进程。

如果您的版本du不支持-d您可以使用的选项

du -h /data/dataold/exports

并过滤输出以删除第一级子目录以下的所有内容。


如果您想通过数字比较来过滤输出,我建议省略该选项-h。为了避免在测试过滤时等待缓慢的文件系统访问,我建议将输出重定向到文件,例如

du -d 1 /data/dataold/exports > outputfile

或者

du -d 1 /data/dataold/exports 2>errors | tee outputfile

并处理后面的内容outputfile

例子:

awk '$1 > 20e9` outputfile

如果您du不支持选项,-d您可以使用类似的选项

du /data/dataold/exports > outputfile
awk '$1 > 20e9 && $1 != /\/.*\/.*\/.*\/.*\/.*/` outputfile

这将打印第一个字段中数字大于 20 * 10^9 且第二个字段中不包含 5 个(或更多)斜杠的值的所有行。第二个条件中的斜杠数量是根据起始目录定制的/data/dataold/exports,并且将打印eg/data/dataold/exports/foo但不打印eg /data/dataold/exports/foo/bar

答案2

尽量不要总结然后让du工作去做。sort按照uman 订单申请-h,然后将其限制为特定尺寸:

du -h /data/dataold/exports/ | sort -h

用于按-r相反sort顺序列出,即从大到小文件。

要选择尺寸,awk可以使用一个简单的技巧:

du -h /data/dataold/exports/ | awk -F'G' '$1~/^[0-9]+$/ && $1>=20' | sort -h 

即:使用G(来自 GB 大小输出)作为字段分隔符,检查字段是否仅为数字(以排除与 G 分隔符的错误匹配),然后仅选择大于 20 的数字。此处排序是可选的。

相关内容