我有一个大约 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 -exec
du
使用 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 的数字。此处排序是可选的。