我想按大小从大到小的顺序列出所有文件,并且这些文件可以存在于某个文件夹中的任何位置。
man ls
:-S sort by file size
我想按大小从大到小的顺序列出所有文件,并且这些文件可以存在于某个文件夹中的任何位置。
man ls
:-S sort by file size
Answers:
只需使用类似:
ls -lS /path/to/folder/
资本小号。
这将按大小对文件进行排序。
另请参阅:
-S sort by file size
如果要以相反的顺序排序,只需添加-r
switch。
更新:
要排除目录(并且不提供文件名或符号链接目标均不包含换行符),请执行以下操作:
ls -lS | grep -v '^d'
更新2:
我现在看到它仍然如何显示符号链接,该链接可能是文件夹。与链接一样,符号链接始终以字母l开头。
更改命令以筛选-
。这只应保留常规文件:
ls -lS | grep '^-'
在我的系统上,这仅显示常规文件。
更新3:
要添加递归,我将把行的排序留给sort
命令,并告诉它使用第5列进行排序。
ls -lR | grep '^-' | sort -k 5 -rn
-rn
表示反向和数字表示将最大的文件放在顶部。该命令的缺点是它不显示文件的完整路径。
如果您确实需要文件的完整路径,请使用以下命令:
find . -type f -exec du -h {} + | sort -r -h
该find
命令将递归地查找.
和调用的所有子目录中的所有文件du -h
(表示磁盘使用情况-human可读),然后再次对输出进行排序。如果您的find
/ sort
不支持-h
,请用du -k
和替换sort -rn
。请注意,大小和磁盘使用情况不是同一回事。
du
给出与文件大小不同的磁盘使用情况。使用(GNU)时du -h
,数字排序将不起作用(您需要使用-h
GNU选项进行排序)。xargs期望使用可能带引号的单词的列表作为输入,因此,如果文件名包含空格或带引号的字符,它将不起作用。
find . -type f -print0 | xargs -0 du -h | sort -rh
。如果您只想说最大的30个文件:find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30
。
+ |
语法+ | sort -r -h
?
您可以使用诸如查找和排序之类的方法。
find . -type f -ls | sort -r -n -k7
(该-ls
选项不是标准的,但可以在许多find实现中找到,不仅是GNU的。在GNU find和其他版本中,它显示的内容类似于某些ls -li
例外,例如,带有ACL的文件未标有+)
如果文件名可能包含换行符,请使用GNU find和GNU sort:
find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
使用zsh和GNU ls:
ls -ldU -- **/*(.OL)
其中(.OL)
有一个glob限定符,仅.
选择常规文件,OL
以长度反转顺序(文件大小,o
升序,O
降序)。
(请注意,较早版本的zsh的文件大小超过2 ^ 32时会出现问题)。
某些操作系统对传递给命令的参数列表的大小有限制。在这些情况下,您需要:
autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU
如果只需要文件列表而不是详细输出,请执行以下操作:
print -rl -- **/*(.OL)
如果你想包括隐藏文件(名称以一个点开始,除了.
和..
)和隐藏目录搜索为好,加D
通配预选赛:
print -rl -- **/*(.DOL)
.OL
办?这是命令的一部分吗?
ls (GNU coreutils) 8.25
和zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
。它仅适用于ls
和的某些版本zsh
吗?
按大小递增列表文件将是:
ls -lSr
选项包括:
说“文件可能存在于某个文件夹中的任何位置”表示您要递归地降级起始目录(文件夹)中的所有目录(文件夹)。这是find
要执行的操作:
find . -type f -exec ls -lSd {} +
这会“查找” 当前工作目录()中的所有文件.
。对于找到的每个文件,ls
运行一个过程以按大小顺序对找到的对象进行排序。的+
终止符-exec
导致将多个参数作为列表传递给ls
。除非您的目录(文件夹)包含大量文件,否则您应该有一个列表(因此要分叉一个进程),从而获得所需的结果。
试试这些,对我来说很好。
$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10
# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'
虽然不是完美的答案,但在一定程度上有效
$ ls -lS |grep '^-' | head -n 6
sed
添加到delh的答案和StéphaneChazelas的评论中...
find -print0
结合xargs -0
增加了对空格/空格/诸如此类的支持。
du -h | sort -rn
在不同的字节倍数之间无法正确排序,例如在128K之后将显示1.1M,这是错误的。
sort -rh
(--human-numeric-sort)可以解决这个问题,但仅适用于GNU版本。
下面的命令将提供所需的输出。
易于阅读,在GNU的排序/ Linux上:
find . -type f -print0 | xargs -0 du -h | sort -rh
在BSD / OSX /其他平台上,以千字节为单位:
find . -type f -print0 | xargs -0 du -k | sort -rn
对于BSD / OSX,另请参阅https://unix.stackexchange.com/a/188375/82895。
作为原始问题的一个变体,如果您想查看子目录中文件的累积大小:
#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr
大小将以兆字节(m
in du -sm
)显示。接受的其他值du
是-k
千字节-g
和千兆字节。使用-h
人类可读的显示是不可能的,因为它会破坏排序。
这是sed
用于附加M
for兆字节的版本:
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'
设置要显示的目录,通过该目录${1:-.}
将使用第一个命令行参数(如果提供),或者使用当前目录(如果不带参数调用)。
注意:这可能需要很长时间才能处理很多文件。该选项-type d
将仅列出子目录,并排除当前文件夹中的文件。如果您还想查看当前文件夹中的文件,请删除它。
注意:您可能想改用
ncdu
大多数linux仓库(在ubuntu / debian上apt install ncdu
)以及osx(brew install ncdu
)上可用的版本。