如何找出文件夹中最大的第 n 个文件?

如何找出文件夹中最大的第 n 个文件?

如何找出文件夹中除第一个文件夹中的文件之外最大的 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

相关内容