我想按大小从大到小的顺序列出所有文件,并且这些文件可以存在于某个文件夹中的任何位置。

评论

相关的unix.stackexchange.com/questions/88065/…

来自man ls:-S按文件大小排序

您是说“文件在此目录中”还是“文件可能在任何子目录中”。

如果您能够/想要使用GUI工具,请查看QDirStat(以前为KDirStat)。

#1 楼

只需使用以下内容:

ls -lS /path/to/folder/


大写S。

这将按大小对文件进行排序。

也请参见:

man ls

-S     sort by file size


如果要以相反的顺序排序,只需添加-r开关。

更新:

要排除目录(且文件名或符号链接目标均不包含换行符):

ls -lS | grep -v '^d' 


更新2:

我现在看到它仍然如何显示符号链接,它可能是文件夹。与链接一样,符号链接始终以字母l开头。

更改命令以过滤-。这应该只保留常规文件:

ls -lS | grep '^-'
在我的系统上,这仅显示常规文件。

更新3:

要添加递归,我将把行的排序留给sort命令,并告诉它使用第五列进行排序。

ls -lR | grep '^-' | sort -k 5 -rn


-rn表示反向和数字,以使最大的文件位于顶部。该命令的缺点是它不会显示文件的完整路径。

如果您确实需要文件的完整路径,请使用类似以下的内容:

find . -type f  -exec du -h {} + | sort -r -h


find命令将递归地查找.的所有子目录中的所有文件,并调用du -h(表示磁盘使用情况-人类可读),然后再次对输出进行排序。如果您的find / sort不支持-h,请替换为du -ksort -rn。请注意,大小和磁盘使用情况不是同一回事。

评论


du给出的磁盘使用情况与文件大小不同。使用(GNU)du -h,数字排序将不起作用(您需要使用-h GNU选项进行排序)。 xargs期望使用可能带引号的单词的列表作为输入,因此,如果文件名包含空格或带引号的字符,它将不起作用。

–StéphaneChazelas
2012年11月3日23:57

我看到-S大小按降序排列,那么升序呢?

–魔鬼
16 Mar 8 '16 at 15:40

在@StéphaneChazelas之后,这对我有用:find。型f -print0 | xargs -0 du -h |排序-rh。如果您只想说最大的30个文件:查找。型f -print0 | xargs -0 du -h |排序-rh |头-n 30。

–user7543
16年5月16日在11:13

嗨!您能否解释一下+ | + |中的语法-r -h排序?

–维克多
18年9月9日在11:44

@Victor,请参阅unix.stackexchange.com/questions/195939/…。

–休·沃尔夫
18年11月27日,0:33

#2 楼

您可以使用诸如find和sort之类的东西。等等,它显示类似于-ls的内容,但有一些例外,例如,带有ACL的文件未标有+)

如果文件名可能包含换行符,则使用GNU find和GNU sort :

find . -type f -ls | sort -r -n -k7


评论


假设“组”列(来自-ls)不包含任何空格(因此-k 7参数),但不一定如此。

–kolistivra
2014年11月3日16:00

为什么不简单地执行find ... -print0 | -zk7rn0排序?

–安德烈·德·米兰达(Andre de Miranda)
16-9-28在10:24

谢谢,这对我很有用,当我正在寻找一些大型的隐藏文件时,如果我的Mac空间不足,该文件将被删除:)

–山姆聊天
19年11月2日在16:49

#3 楼

对于zsh和GNU ls:

ls -ldU -- **/*(.OL)


其中(.OL)是全局限定符,.仅选择常规文件,OL按长度反向(文件大小,o升序)顺序,O为降序)。

(请注意,较早版本的zsh的文件大小超过2 ^ 32时会出现问题)。

某些操作系统对大小有限制传递给命令的参数列表。在这种情况下,您需要:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU


如果只需要文件列表而不是详细的输出,只需执行:

print -rl -- **/*(.OL)


如果要包含隐藏文件(其名称以点号开头,...除外)并搜索隐藏目录,请添加D全局限定符:

print -rl -- **/*(.DOL)


评论


.OL做什么?这是命令的一部分吗?

–alpha_989
18年6月12日在15:36

@ alpha_989,请参阅编辑

–StéphaneChazelas
18年6月12日在15:44

感谢您的解释,Stephane ..但是,由于某些原因..该命令在我的工作站上不起作用..我正在使用ls(GNU coreutils)8.25和zsh 5.1.1(x86_64-ubuntu-linux-gnu)。它仅适用于某些版本的ls和zsh吗?

–alpha_989
18年6月12日在18:18

@ alpha_989,它对您不起作用?它对我来说适用于那些相同的版本,并且该代码中没有任何东西至少在15年前的版本中不起作用。

–StéphaneChazelas
18年6月12日在20:40

#4 楼

按大小递增的列表文件为:

ls -lSr


选项为:


l:长,显示详细的用户,组,其他属性,日期等。
S:按大小列出的订单(默认情况下递减)
r:反转列表的顺序


评论


您介意解释提高答案质量的选项吗?

– Rui F Ribeiro
16年6月29日在18:53

#5 楼

说“文件可能存在于某个文件夹中的任何位置”意味着您要递归地降级起始目录(文件夹)中的所有目录(文件夹)。这是find的作用:

find . -type f -exec ls -lSd {} +


这“查找”当前工作目录(.)中的所有文件。对于找到的每个文件,运行一个ls进程以按大小顺序对找到的对象进行排序。 +-exec终止符导致将多个参数作为列表传递给ls。除非您的目录(文件夹)包含大量文件,否则您应该只有一个列表(因此要分叉一个进程),从而得到想要的结果。

评论


这很好,因为它允许您在ls上使用-h修饰符以显示好的文件大小

– shmish111
15年5月16日在8:48

#6 楼

试试这些,对我来说很好用。 />
$ ls -lS |grep  '^-' | head -n 6 


评论


如果文件名不包含任何空格,则awk可以正常工作。

– Eir Nym
16 Mar 20 '16 at 8:01

是的..使用'sed'并用下划线替换空格吗?如果有帮助

–桑杰·拉维(Sandjaie Ravi)
16年4月12日在9:29

不,我用sed削减输出

– Eir Nym
16年4月12日在11:21

#7 楼

以相反的顺序显示文件列表:ls -lSrh

以升序显示:ls -lSh

评论


+1用于将-h标志用于人性化输出。

–computingfreak
16年7月3日,0:34

#8 楼

我前一段时间写了一些东西。您可以传递一个参数来指定要列出的文件数量,或者只键入big,在这种情况下,您将获得10。

big () { 
    NUM_FILES=10;
    if [  ]; then
        NUM_FILES=;
    fi;
    du | sort -nr | head -n $NUM_FILES
}


#9 楼

添加到delh的答案和StéphaneChazelas的评论中...

find -print0xargs -0结合使用,增加了对空格/空格/诸如此类的支持。倍数,例如在128K之后将显示1.1M,这是错误的。

du -h | sort -rn(--human-numeric-sort)可以解决这个问题,但仅适用于GNU版本。

下面的命令将提供所需的输出。

人类可读的,在GNU的sort / Linux上:

sort -rh
/ OSX /其他:

find . -type f -print0 | xargs -0 du -h | sort -rh

对于BSD / OSX,另请参见https://unix.stackexchange.com/a/188375/82895。

#10 楼

作为原始问题的变体,如果您想查看子目录中文件的累积大小,请执行以下操作:

 #!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr
 


大小将以兆字节(m中的du -sm)显示。 du接受的其他值是-k(千字节)和-g(千兆字节)。无法使用-h进行人类可读的显示,因为它将破坏排序。

这是一个使用sed附加M的版本,表示兆字节:

 find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/M/g'
 


通过${1:-.}设置要显示的目录,如果提供的话,它将使用第一个命令行参数;如果不带参数调用,则使用当前目录。

注意:这可能需要很长时间才能处理很多文件。选项-type d将仅列出子目录并排除当前文件夹中的文件。如果您还想查看当前文件夹中的文件,请删除它。


注意:您可能要改用ncdu,它在大多数linux仓库(在ubuntu / debian apt install ncdu上)以及osx(brew install ncdu)上都可用。 />