如何列出按大小排序的所有文件


241

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



5
来自man ls-S sort by file size
ctrl-alt-delor

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

如果您能够/想要使用GUI工具,请查看QDirStat,以前是KDirStat
RhinoDevel

Answers:


290

只需使用类似:

ls -lS /path/to/folder/

资本小号

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

另请参阅:

man ls

-S     sort by file size

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

更新:

要排除目录(并且不提供文件名或符号链接目标均不包含换行符),请执行以下操作:

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。请注意,大小磁盘使用情况不是同一回事。


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

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

3
在@StéphaneChazelas之后,这对我有用:find . -type f -print0 | xargs -0 du -h | sort -rh。如果您只想说最大的30个文件:find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30
user7543 '16

嗨!您能否解释中的+ |语法+ | sort -r -h
维克多


25

您可以使用诸如查找和排序之类的方法。

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'

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

1
为什么不简单地做find ... -print0 | -zk7rn0排序?
安德烈·德·米兰达

10

使用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办?这是命令的一部分吗?
alpha_989

@ alpha_989,看到编辑
斯特凡Chazelas

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

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

9

按大小递增列表文件将是:

ls -lSr

选项包括:

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

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

6

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

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

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


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


2

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

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

2

试试这些,对我来说很好。

$ 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 

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

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

不,我sed
过去

1

添加到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


1

作为原始问题的一个变体,如果您想查看子目录中文件的累积大小:

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

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

这是sed用于附加Mfor兆字节的版本:

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)上可用的版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.