如何找出文件夹中除第一个文件夹中的文件之外最大的 n 个文件?
在此示例中,对于n=2:
dir
--file 50KB
--dir1
--dir2
----file2_1.txt (size 25KB)
--dir3
----dir3_1
------file3_1.txt (size 35KB)
------file3_2 (size 25KB)
结果:
dir/dir3/dir3_1/file3_1.txt 35KB
dir/dir2/file2_1.txt 25KB
答案1
find . -mindepth 2 -printf "%s\t%p\n" | sort -n | cut -f 2- | tail -n $n
这里,最大的文件排在最后。如果你想改变顺序,让最大的文件排在最前面:
find . -mindepth 2 -printf "%s\t%p\n" | sort -nr | cut -f 2- | head -n $n
# .............................................^...............^^^^
使用 GNU 工具集,您可以处理包含换行符的文件名(烦人但有效):
find . -mindepth 2 -printf "%s\t%p\0" | sort -znr | cut -zf 2- | head -zn $n
为了获得所需的输出,您可以执行以下操作:
find . -mindepth 2 -printf "%s\t%p\n" |
sort -nr |
head -n 5 |
perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane '
push @F, format_bytes(shift @F);
print join "\t", @F;
'
使用 perl 模块数量::字节::人类来自 CPAN。
答案2
尽管您标记了您的问题bash
,但这里还是提供了一个zsh
解决方案,以防其他人发现它有用。
鉴于
% tree -h dir
dir
├── [ 512] dir1
├── [ 512] dir2
│ └── [ 25K] file2_1.txt
├── [ 512] dir3
│ └── [ 512] dir3_1
│ ├── [ 35K] file3_1.txt
│ └── [ 25K] file3_2.txt
└── [ 50K] file
4 directories, 4 files
然后zsh
使用glob 限定符:
% print -RC1 dir/*/**/*(.OLon[1,2])
dir/dir3/dir3_1/file3_1.txt
dir/dir2/file2_1.txt
在哪里
dir/*/
确保我们至少启动下面 1 个目录dir
,相当于find
-mindepth
**/*
bash
是一个递归匹配的 shell glob(如果globstar
设置了选项,则可以使用相同的选项)()
包含一组限定符,具体来说.
仅匹配常规文件(相当于find -type f
)OL
按大小对结果进行排序(大号长度)下降,而on
打破平局n同升序[1,2]
选择一系列结果
不同的是find
,shell glob 通常默认忽略隐藏文件 - 如果要包含它们,请添加D
到限定符中,即(.DOLon[1,2])
答案3
我首先想到的是:
ls -lsR * | awk '{print $6,$10}'| sort -nr | head -n5
答案4
请在下面运行一行代码,其中包含您的必需路径。现在,我正在运行 /var/log/
位置
(sudo du -a /var/log/ |sort -nr|head -n20 |awk '{print $NF}'|while read l ;do du -csh $l|grep -vi total;done ) 2> /dev/null