按名称选择目录并按大小排序列表

按名称选择目录并按大小排序列表

我想找到具有特定名称(例如.stversions)的所有目录,并获取按其大小排序的列表。我计划使用find -name .stversions来获取目录, du -hd1确定每个目录的大小,以及sort -h.但我无法将它们放入单行命令中:

find -name .stversions | du -hd1 | sort -h

似乎不选择目录(该命令单独执行),但是 - 在一些关于权限被拒绝的抱怨之后 - 确定当前目录中目录的大小并生成排序的输出。如何通过管道将输出从find传送到du

答案1

标准du命令不需要来自的输入标准输入所以管道进入它不会有任何影响。 (它也不处理-hor -d1。)GNU 版本将接受以 NUL 分隔的文件列表(请参阅 参考资料man du)。

如果您要使用 GNU,du那么您不妨在整个管道中使用 NUL 终止记录,这将满足包含意外字符(包括空格)的文件名(目录名)的需要。

find -type d -name '.stversions' -print0 | du -h -d1 --files-from0 - -0 | sort -z -h | tr '\0' '\n'

答案2

du不处理文本流,它需要文件名列表。这意味着您不能简单地通过管道将文本流传递给它,即使该流恰好包含文件名,因为它无法读取它。因此,您有两个主要选择:i)使用xargs专为此类事情设计的工具或 ii)循环读取文件名并将其传递给du.两者中,xargs是迄今为止最简单的:

find -name '.stversions' | xargs du -hd1 | sort -h 

但是,如果您的任何路径有任何空格字符,则此方法将会失败。更强大的解决方案是罗艾玛的回答,或者使用 GNU 工具:

find -type d -name '.stversions' -print0 | xargs -0 du -hd1 | sort -h 
            

相关内容