排序可读文件大小


16

如何使用易于理解的文件大小排序(考虑大小标识符(G,M,K)的数字排序)对列表进行排序?我du -sh可以例如对输出进行排序吗?

问题:考虑列出文件/文件夹并按文件大小对其排序的问题。您可以通过运行以下命令来实现:

du -s * | sort -n

这列出了按大小排序的文件/文件夹。但是,打印的大小值以字节为单位(如果选择,则为兆字节或千兆字节)。

希望能够根据人类可读的值进行排序,因此我可以运行类似于

du -sh * | <human-readable file sort>

并有2.0M后显示1.5GB文件夹。

Answers:



29

使用GNU coreutils> = 7.5:

du -hs * | 排序-h

(来自此serverfault问题

手册页

编辑:您可以使用du --version以及sort --version是否使用GNU版本来检查您的版本。如果您使用自制软件,则可能需要使用gdugsort


8
OSX没有此选项。您可以使用自制程序brew install coreutils(在所有coreutils命令前添加“ g”)。然后可以做gdu -hs * | gsort -h
dsummersl 2014年

1
只是为了阐明@dsummersl的观点:du -hs *在Mac OS X上可以正常使用,但是会sort -h返回sort: invalid option -- h。你也可以通过MacPorts的描述安装coreutils软件包这里
jvriesem 2014年

3

如果您只是担心大于1MB的文件(看起来确实如此),可以使用以下命令对它们进行排序,然后使用awk将大小转换为MB:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

同样,这会将大小四舍五入到最接近的MB。您可以将其修改为您选择的单位。


这类似于:du -sm * | sort -n-s/ -g使du输出大小以兆字节/千兆字节为单位。
notnoop

对于MB,您必须再除以1024。这样就可以了int($1 / (1024 * 1024))
Pratik Khadloya 2014年

2

这处理带有空格或撇号的文件名,并且在不支持xargs -d或的系统上工作sort -h

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

结果是:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm

1

这是另一个:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

您可能需要做一个

$ cpan Number::Bytes::Human

第一。


1

du -sk * | 排序-n | awk'{print $ 2}'| 同时读f; 做du -sh“ $ f”; 完成


1

此命令将按大小排序(以MB为单位)

du --block-size=MiB --max-depth=1 path | sort -n

这已经是用户实际在做的事情,他/她只是没有给出MiB的示例,而是提到了这一点。他/她正在寻找的是能够在使用-hdu标志时进行排序。
Tonin

0

我到这里结束了,因为我试图对将MB和GB合并为同一输出的其他内容进行排序,但我无法控制它。

$NF使用,因为#GBor #MB模式是输出中的最后一列:

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

awk命令的说明:

if ($NF ~ /[0-9\.]+GB/)

如果最后一列与包含数字或.一个或多个后跟正则表达式的模式匹配GB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

然后将变量设置a为与最后一列($NF)中的相同正则表达式模式匹配的每一行的数字部分

printf "%sMB\n", a*1024} \

设置后a,用于printf将输出格式化为${a*1024}MB

else {print $NF}

否则只打印最后一列

sort -n

在输出上使用数字排序


echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

我敢肯定有一种方法可以重用正则表达式模式,所以我只执行一次匹配并就地替换,但是我还不知道该怎么做:)

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.