我想找到当前目录中最大的 n 个子目录(例如 3)进而列出其中的所有文件。我对寻找最大的文件不感兴趣。我知道有很多解决方案可以找到最大的文件但这不是我想要的。
我找到了我的 3 个最大的子目录,其中有以下几行:
$ du -hs */ | sort -rh | head -3
结果:
212K 04/
52K 02/
20K 03/
但不知何故,我无法列出这些目录中的文件(使用管道ls没有用)。有什么建议可以实现吗?
答案1
您可以将管道命令的结果与 while 循环一起使用:
du -hs */ | sort -rh | head -3 | while read -r size dir
do
ls -l "$dir"
done
一句话:
du -hs */ | sort -rh | head -3 | while read -r size dir ; do ls -l "$dir"; done
谢谢钢铁司机read
建议在循环中使用while
而不是for
使用循环awk
,以更为稳健的方式处理带有空格和特殊字符的文件名。
答案2
命令替换,借助来awk
获取前 3 个目录:
ls -l $(du -hs */ | sort -rh | awk 'NR==4{exit} {print $2}')
假设没有目录名包含任何空格或任何不寻常的字符。
健壮的方法:处理任何可能的文件(目录)名称,将目录名称以 NUL 分隔输出awk
,并借助于来xargs
处理每个目录:
du -0hs */ | sort -zrh | awk 'BEGIN{RS="\0"} NR==4{exit} {printf("%s\0", $2)}' | \
xargs -0 ls -l
每次查看每个目录的内容:
du -0hs */ | sort -zrh | awk 'BEGIN{RS="\0"} NR==4{exit} {printf("%s\0", $2)}' | \
xargs -0 -I{} ls -l {}