![按名称选择目录并按大小排序列表](https://linux22.com/image/14525/%E6%8C%89%E5%90%8D%E7%A7%B0%E9%80%89%E6%8B%A9%E7%9B%AE%E5%BD%95%E5%B9%B6%E6%8C%89%E5%A4%A7%E5%B0%8F%E6%8E%92%E5%BA%8F%E5%88%97%E8%A1%A8.png)
我想找到具有特定名称(例如.stversions
)的所有目录,并获取按其大小排序的列表。我计划使用find -name .stversions
来获取目录, du -hd1
确定每个目录的大小,以及sort -h
.但我无法将它们放入单行命令中:
find -name .stversions | du -hd1 | sort -h
似乎不选择目录(该命令单独执行),但是 - 在一些关于权限被拒绝的抱怨之后 - 确定当前目录中目录的大小并生成排序的输出。如何通过管道将输出从find
传送到du
?
答案1
标准du
命令不需要来自的输入标准输入所以管道进入它不会有任何影响。 (它也不处理-h
or -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