我正在尝试显示特定目录中前 20 个最大的文件。我想包含所有子目录,但不包含实际目录本身。 (我只想要文件。)我一直在尝试找到一种方法来做到这一点,并且我在网上找到的所有解决方案都不适用于我正在使用的 Unix 上的版本。
到目前为止我有这个:
find /dir -type f -exec ls -al {} \; | sort -nr | head -n 20 du -a -g /dir/ | sort -n -r | head -n 20
拳头给了我一个清单如下:
file1.txt
file1.txt
file1.txt
file2.txt
等等。第二个命令给我以下内容:
500 \path\
250 \path\to\
100 \path\to\directory\
等等。我正在寻找的结果是:
500 \path\file1.txt
250 \path\to\file2.txt
100 \path\to\directory\file3.txt
等等。我尝试过以下问题的解决方案:
- 递归查找最大文件
- https://stackoverflow.com/questions/12522269/how-to-find-the-largest-file-in-a-directory-and-its-subdirectories
我也尝试遵循本教程:
答案1
find dir/ -type f -exec du -a {} + | sort -nr | head -n 20
答案2
在zsh
shell 中,通配符模式
/dir/**/*(.DOL[1,20])
将扩展到目录中或目录下 20 个最大文件的路径名/dir
(也考虑隐藏名称并忽略符号链接文件)。
glob 限定符的各个部分(.DOL[1,20])
意味着:
.
:仅考虑常规文件。D
dotglob
:还要考虑具有隐藏名称的文件(如in的效果bash
)。OL
:按文件大小降序对结果进行排序(O
= 降序,而不是o
= 升序;L
=“长度”)。[1,20]
:返回 glob 扩展到的第 20 个元素。
该**
模式“递归”匹配,因此/dir/**/*
其本身将匹配/dir
目录中或目录下的任何名称。
将此与以下内容一起使用ls
:
ls -l -f /dir/**/*(.DOL[1,20])
您必须使用-f
withls
来阻止它对显示的列表进行排序。
或者,调用du
文件:
du /dir/**/*(.DOL[1,20])