我想按大小从大到小的顺序列出所有文件,并且这些文件可以存在于某个文件夹中的任何位置。
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
如果要以相反的顺序排序,只需添加-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。请注意,大小和磁盘使用情况不是同一回事。
du给出与文件大小不同的磁盘使用情况。使用(GNU)时du -h,数字排序将不起作用(您需要使用-hGNU选项进行排序)。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
大小将以兆字节(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)上可用的版本。