Як ви сортуєте du вихід за розміром?


196

Як сортувати du -sh /dir/*за розміром? Я прочитав один сайт, який говорив про використання, | sort -nале це, очевидно, неправильно. Ось приклад, що неправильно.

[~]# du -sh /var/* | sort -n
0       /var/mail
1.2M    /var/www
1.8M    /var/tmp
1.9G    /var/named
2.9M    /var/run
4.1G    /var/log
8.0K    /var/account
8.0K    /var/crash
8.0K    /var/cvs
8.0K    /var/games
8.0K    /var/local
8.0K    /var/nis
8.0K    /var/opt
8.0K    /var/preserve
8.0K    /var/racoon
12K     /var/aquota.user
12K     /var/portsentry
16K     /var/ftp
16K     /var/quota.user
20K     /var/yp
24K     /var/db
28K     /var/empty
32K     /var/lock
84K     /var/profiles
224M    /var/netenberg
235M    /var/cpanel
245M    /var/cache
620M    /var/lib
748K    /var/spool

3
Я знав, що бачив це раніше . Відповідь, котрий найбільше голосує , не дуже хороший, але інші - кращі .
Жиль

Прийнята відповідь sort -hспрацювала для мене в Ubuntu 16.04 LTS в серпні 2017 року. Спочатку я знайду свій змонтований диск cd /mnt(встановлений UUID у fstab). Тоді я du >~/dumnt.out тоді sort -h ~/dumnt.out >~/dumntsort.outтоді можу зробити `хвост ~ / dumntsort.out, щоб побачити найбільші космічні свинки.
SDsolar

Відповіді:


252

Якщо у вас є GNU coreutils (поширений у більшості дистрибутивів Linux), ви можете використовувати

du -sh -- * | sort -h

-hОпція вказує , sortщо вхід є людиною-якого читають формат (номер з блоком; +1024 на основі , так що 1 023 вважається менш 1K , яке відбувається відповідає тому , що GNU du -hробить).

Ця функція була додана до GNU Core Utilities 7.5 у серпні 2009 року .

Примітка:

Якщо ви використовуєте старішу версію Mac OSX, вам потрібно встановити coreutils з ,, а brew install coreutilsпотім використовувати gsortяк заміну випадаючої версії sort.

Новіші версії macOS (перевірені в Mojave) підтримують на самому світі sort -h.


27
Примітка: додайте -rдо сортування, якщо хочете великих у верхній частині
ксенотеррацид

9
На OSX ви можете встановити coreutilsчерез brewта додати папку bin PATHу свій файл rc , і вона -hповинна бути доступною.
kenorb

О - дякую за -р нагадування. це означає, що мені не потрібна tailкоманда, щоб побачити свиней.
SDsolar

47

Спробуйте використати прапор -k для підрахунку 1К-блоків, за допомогою яких можна прочитати людиною. Потім у вас є загальний блок і ви можете легко зробити числовий сортування.

du -ck | sort -n

Ви не потребуєте явних людських одиниць, але якщо ви це зробили, то існує маса способів це зробити. Багато хто, здається, використовують техніку блоку 1K вище, а потім здійснюють другий дзвінок у du.

https://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size

Якщо ви хочете побачити одиниці KB додані, скористайтеся:

du -k | sed -e 's_^\([0-9]*\)_\1 KB_' | sort -n

2
приємно, що не потрібно встановлювати щось інше, щоб отримати потрібні мені результати
taranaki

16

Якщо у вас немає останньої версії GNU coreutils , ви можете зателефонувати, duне -hотримуючи сортований вихід, і створити дружній для людини вихід з невеликою пост-обробкою. Це має перевагу роботи, навіть якщо у вашій версії duнемає -hпрапора.

du -k | sort -n | awk '
    function human(x) {
        if (x<1000) {return x} else {x/=1024}
        s="kMGTEPZY";
        while (x>=1000 && length(s)>1)
            {x/=1024; s=substr(s,2)}
        return int(x+0.5) substr(s,1,1)
    }
    {gsub(/^[0-9]+/, human($1)); print}'

Якщо ви хочете суфікси SI (тобто кратні 1000, а не 1024), змініть 1024 до 1000 у whileтілі циклу. (Зверніть увагу, що ці 1000 в умові призначені, щоб отримати, наприклад, 1Mа не 1000k.)

Якщо у вас duє можливість відображення розмірів у байтах (наприклад, -bабо -B 1- зауважте, що це може мати побічний ефект підрахунку фактичних розмірів файлів, а не використання диска), додайте пробіл на початок s(тобто s=" kMGTEPYZ";) або додайте if (x<1000) {return x} else {x/=1024}на початку humanфункція.

Відображення десяткової цифри для чисел у діапазоні 1–10 залишається читачем як вправа.


Це було одне з нестандартних рішень, я знайшов роботу як на Linux, так і на Mac. Дуже дякую!
Брайан Грем

9

Якщо у вас немає, sort -hможете зробити це:

du -sh * | sed 's/\([[:digit:]]\)\t/\1B\t/' | sed 's/\(.\t\)/\t\1/' | sed 's/G\t/Z\t/' | sort -n -k 2d,2 -k 1n,1 | sed 's/Z\t/G\t/'

Це отримує список du, відокремлює суфікс та сортує його. Оскільки суфікса для <1K немає, перший sed додає B (для байтів). Другий sed додає роздільник між цифрою та суфіксом. Третій sed перетворює G у Z так, що він більший за M; якщо у вас є терабайтні файли, вам доведеться перетворити G в Y і T в Z. Нарешті, сортуємо за двома стовпцями, потім замінюємо суфікс G.


Дивовижні зусилля, але це не наближається до роботи для мене.
jvriesem

6

В OS X ви можете встановити необхідні coreutils через Homebrew :

brew install coreutils

З цим ви отримаєте gsort, що включає параметр -hкомандного рядка.


4

Цей маленький сценарій Perl робить свою справу. Збережіть його як duh(або як завгодно) та зателефонуйте за допомогоюduh /dir/*

#!/usr/bin/perl -w
use strict;

my @line;

sub to_human_readable {
        my ($number) = @_;
        my @postfix = qw( k M G T P );
        my $post;
        my $divide = 1;
        foreach (@postfix) {
                $post = $_;
                last if (($number / ($divide * 1024)) < 1);
                $divide = $divide * 1024;
        }
        $number = int($number/$divide + 0.5);
        return $number . $post;
}

sub trimlengthright {
        my ($txt, $len) = @_;
        if ( length($txt) >= $len ) {
                $txt = substr($txt,0,$len - 1) . " ";
        } else {
                $txt = $txt . " " x ($len - length($txt));
        }
        return $txt;
}

sub trimlengthleft {
        my ($txt, $len) = @_;
        if ( length($txt) >= $len ) {
                $txt = substr($txt,0,$len - 1) . " ";
        } else {
                $txt = " " x ($len - length($txt)) . $txt;
        }
        return $txt;
}

open(DF,"du -ks @ARGV | sort -n |");
while (<DF>) {
        @line = split;
        print &trimlengthleft(&to_human_readable($line[0]),5)," "; # size
        print &trimlengthright($line[1],70),"\n"; # directory
}
close DF;

4

Оскільки у Mac OS X немає -hможливості для sort, тому я спробував і навчився, sedі awkдля першої спроби:

du -sk * | sort -g | awk '{ numBytes = $1 * 1024; numUnits = split("B K M G T P", unit); num = numBytes; iUnit = 0; while(num >= 1024 && iUnit + 1 < numUnits) { num = num / 1024; iUnit++; } $1 = sprintf( ((num == 0) ? "%6d%s " : "%6.1f%s "), num, unit[iUnit + 1]); print $0; }'

це довга лінія. Розширено, це:

du -sk * | sort -g | awk '{ 

    numBytes = $1 * 1024; 
    numUnits = split("B K M G T P", unit); 
    num = numBytes; 
    iUnit = 0; 

    while(num >= 1024 && iUnit + 1 < numUnits) { 
        num = num / 1024; 
        iUnit++; 
    } 

    $1 = sprintf( ((num == 0) ? "%6d%s " : "%6.1f%s "), num, unit[iUnit + 1]);
    print $0; 

}'

Я спробував це на Mac OS X Mavericks, Yosemite, Ubuntu 2014-04, awkтому що за замовчуванням awk(це nawkтому, що обидва awkі nawkвказують /usr/bin/mawk) або gawk, і всі вони працювали.

Ось зразок виводу на Mac:

     0B  bar
     0B  foo
   4.0K  wah
  43.0M  Documents
   1.2G  Music
   2.5G  Desktop
   4.7G  Movies
   5.6G  VirtualBox VMs
   9.0G  Dropbox
  11.7G  Library
  21.2G  Pictures
  27.0G  Downloads

замість того du -sk *, я побачив у відповіді @ Стефана, де також відображається велика сума, і не обходячи жодну точку монтажу файлової системи, використовуючиdu -skcx *


1

Ось що я використовую в Ubuntu 10.04, CentOS 5.5, FreeBSD та Mac OS X.

Я позичив цю ідею у www.geekology.co.za/ та earthinfo.org , а також сумнозвісних качок з "Linux Server Hacks" від O'Reilly. Я все ще адаптую це до моїх потреб. Це ще триває робота (як і раніше, я працював над цим у поїзді сьогодні вранці.):

#! /usr/bin/env bash
ducks () {
    du -cks -x | sort -n | while read size fname; do
        for unit in k M G T P E Z Y; do
            if [ $size -lt 1024 ]; then
                echo -e "${size}${unit}\t${fname}"
                break
            fi
            size=$((size/1024))
        done
    done
}
ducks > .ducks && tail .ducks

Ось результат:

stefan@darwin:~ $ ducks
32M src
42M .cpan
43M .macports
754M    doc
865M    Work
1G  .Trash
4G  Library
17G Downloads
30G Documents
56G total

stefan@darwin:~ $

Я думаю, ти мав на увазі du -cks -x *? (з зірочкою)
nopole

Зірочка є зайвою у цьому використанні. Спробувати.
Стефан Ласєвський

ти маєш на увазі введення першого набору коду у файл, який називається ducks, а потім, chmod a+x ducksа потім використовувати ./ducksдля запуску? Тоді я бачу лише загальне використання диска, як на Mac OS X, так і на Ubuntu 2014-10. Я також спробував ввести ducks() { ...}визначення, .bashrcа потім використати ducksдля його запуску, і те саме, що на Mac OS X, бачити лише загальний підсумок
nopole

1

Сходити з розуму за цим сценарієм -

$du -k ./* | 
> sort -nr |
> awk '
> {split("KB,MB,GB",size,",");}
> {x = 1;while ($1 >= 1024) {$1 = $1 / 1024;x = x + 1} $1 = sprintf("%-4.2f%s", $1, size[x]); print $0;}'

1

За відсутності GNU sort -hце має працювати в більшості середовищ UNIX:

join -1 2 -2 2 <(du -sk /dir/* 2>/dev/null | sort -k2,2) <(du -sh /dir/* 2>/dev/null | sort -k2,2) | sort -nk2,2 | awk '{ print $3 "\t" $1 }'

0

Цей файл обробляє назви файлів з пробілами або апострофами та працює в системах, які не підтримують 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

0

Це сортуватиме вихід у порядку зменшення розміру:

du -sh /var/* | sort -k 1rn

Це буде сортувати вихід у порядку збільшення розміру:

du -sh /var/* | sort -k 1n

PS: це може використовуватися для сортування за будь-яким стовпцем, але значення стовпців мають бути в одному форматі


1
Номер sort -k1rnеквівалентний sort -rnі просто сортує чисельно на основі початкової послідовності десяткових цифр у кожному рядку. Він не розуміє , з плаваючою точкою, і вона не розуміє k, M, G... суфікси. 10,1 тис. Вважатиметься більшим за 1,23G
Стефан Шазелас

0

Тестували на Solaris!

du -kh | sort -nk1 | grep [0-9]K && du -kh | sort -nk1 | grep [0-9]M && du -kh | sort -nk1 | grep [0-9]G

Це дозволить виводити всі розміри каталогів рекурсивно, внизу буде найбільший каталог в гігабайти, а вгорі найменший - в кілобайт.



0

Команда:

du -ah . | sort -k1 -h | tail -n 50

Пояснення:

  • Розмір списку всіх файлів / папок рекурсивно у поточному каталозі у читаному для людини вигляді

du -ah .

  • Сортуйте прочитаний людиною розмір, який присутній у першому стовпчику, і збережіть найбільше 50

sort -k1 -h | tail -n 50


-1

Сортувати за розміром у МБ

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

Користувач хоче отримати вихід du -h(людський читаний вихід), відсортований в цифровій формі. Ви не даєте відповіді на це. Ви також можете зв’язати свій обліковий запис UNIX-SE з іншими обліковими записами, які ви маєте на інших веб-сайтах SE.
Тонін

-2

Цей сценарій ще простіше:

for i in G M K; do du -h -d1 / | grep [0-9]$i | sort -n; done

-2

для OSX

du -h -k  {PATH} | sort -n

це не -kпросто скасування, -hі якщо так, то як це забезпечує доступний для читання людський результат, який вимагає ОП.
Антон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.