该文件是由生成的
ls -Raltr -block-size=M /* > /home/root/all_files.txt
我用 grep 尝试了几个命令,但没有成功。
答案1
最简单的方法是使用-S
with 来ls
按大小对目录内容进行排序。文件仍然按目录分组,这可能不是您想要的:
ls -RaltrS --block-size=M /*
这种方法在这里可能不是一个选择;可能all_files.txt
是旧文件或者是在另一台计算机上生成的。仍然可以按文件大小对文件名进行排序。对于典型的文件,由ls -Raltr --block-size=M
(注意以两个连字符而不是一个连字符开头)生成的一行输出--block-size
如下所示:
-rw-rw-r-- 1 owner group 1M Apr 16 05:37 file.txt
使用sort
with -h
(对于人类可读的数字,例如 1M)和 with-k 5
来指定文件大小位于文本的第五列(由空格分隔)中:
sort -k 5 -h /home/root/all_files.txt
ls -Raltr --block-size=M /*
对存储的输出进行排序/home/root/all_files.txt
可能会很混乱,因为有额外的行未列出文件大小,因此使用grep
first 只获取您想要的行:
grep '^-' /home/root/all_files.txt | sort -k 5 -h
此处,grep '^-'
丢弃不以连字符开头的行(例如,以d
for 目录或l
for 链接开头的行)。
此答案适用于 Xubuntu 16.04 上的 GNU 工具。尚未在 MacOS 或 BSD 系统上进行测试。
答案2
为了按大小对当前目录中或当前目录下的所有常规文件进行排序,shellzsh
提供了方便的**
通配模式,可以在路径名中进行匹配/
(即“递归地向下进入子目录”)。它还允许排位赛一种模式,以便您仅获得常规文件的匹配项,并且结果根据这些文件的大小进行排序。
在zsh
shell 中,这个模式看起来像
**/*(.OL)
这将返回所有.
按相反 ( O
) 大小顺序 ( ) 排序的常规文件 ( L
)。
要仅获取文件列表,请使用
printf '%s\n' **/*(.OL)
要获得ls
“长列表”输出,请使用
ls -fl **/*(.OL)
(该-f
选项阻止ls
自己对文件进行排序)。
如果zsh
不是普通的 shell,您仍然可以使用这些命令,假设zsh
您的系统上安装了:
zsh -c 'ls -fl **/*(.OL)'
--block-size=M
如果您使用 GNU ,您显然也可以添加它ls
。
如果您只对前十个最大的文件感兴趣,请使用以下模式
**/*(.OL[1,10])
反而。