Как Вы сортируете du, произведенный размером?

Так как whatsmyip.org и ifconfig.me были уже упомянуты:

curl -s icanhazip.com

205
06.11.2018, 17:07
13 ответов

Если у Вас есть GNU coreutils (распространенный в большинстве дистрибутивов Linux), можно использовать

du -sh -- * | sort -h

-h опция говорит sort то, что вход является человекочитаемым форматом (число с единицей; на основе 1024 так, чтобы 1023 считался меньше, чем 1K, который, оказывается, соответствует что GNU du -h делает).

Эта опция была добавлена к GNU Core Utilities 7.5 в августе 2009.

Примечание:

При использовании более старой версии MAC OSX необходимо установить coreutils с brew install coreutils, затем используйте gsort как общедоступная замена sort.

Более новые версии macOS (проверенный на Мохаве) поддержка sort -h исходно.

265
27.01.2020, 19:27
  • 1
    : добавить -r к виду, если Вы хотите большие наверху апач –  xenoterracide 09.12.2010, 14:52
  • 2
    На OSX можно установить coreutils через brew и добавьте папку мусорного ведра к Вашему PATH в Ваш емкостно-резистивный файл, и -h должно быть доступным. –  kenorb 05.03.2015, 16:20
  • 3
    О - спасибо за-r напоминание. это означает, что мне не нужно tail команда для наблюдения пожирателей ресурсов. –  SDsolar 17.08.2017, 11:26

Вот то, что я использую на Ubuntu 10.04, CentOS 5.5, FreeBSD и Mac OS X.

Я одолжил идею у www.geekology.co.za/и earthinfo.org, а также печально известных уток от "Взломов Сервера Linux" 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:~ $
1
27.01.2020, 19:27
  • 1
    я думаю, что Вы имели в виду du -cks -x * ? (со звездочкой) –  nopole 22.04.2015, 12:02
  • 2
    Звездочка избыточна в этом использовании.Попробуйте. –  Stefan Lasiewski 22.04.2015, 21:39
  • 3
    , делают Вы означаете помещать первый набор кода в названный файл ducks, и затем chmod a+x ducks и затем используйте ./ducks выполнять его? Затем я только вижу общее использование диска, и на Mac OS X и на Ubuntu 2014-10. Я также пытался поместить ducks() { ...} определение в .bashrc и затем используйте ducks для выполнения это, и то же самое на Mac OS X, только видит общий итог –  nopole 23.04.2015, 10:20

Если Вы не имеете 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.

9
27.01.2020, 19:27
  • 1
    Потрясающее усилие, но это не близко подходит к работе для меня. –  jvriesem 03.09.2015, 05:55

Этот небольшой сценарий 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
27.01.2020, 19:27

Если у Вас нет последней версии 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 (т.е. кратные числа 1 000, а не 1024), изменяетесь от 1024 до 1 000 в while тело цикла. (Обратите внимание, что это 1000 в условии предназначается, так, чтобы Вы добрались, например. 1M вместо 1000k.)

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

Отображение десятичной цифры для чисел в диапазоне 1–10 оставляют как осуществление читателю.

16
27.01.2020, 19:27
  • 1
    Это, был тот из готового решения, которое я нашел для работы и над Linux и над Mac.Большое спасибо! –  Brian Graham 02.08.2016, 00:46

Попытайтесь использовать флаг-k для блоков количества 1K вместо этого использования человекочитаемого. Затем Вы имеете общую единицу и можете легко сделать числовой вид.

du -ck | sort -n

Вы не делаете explictly требуют человеческих единиц, но если Вы сделали, затем существует набор способов сделать это. Многие, кажется, используют 1K метод блока выше и затем выполняют второй вызов к du.

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

Если Вы хотите видеть, что добавленные единицы КБ, используют:

du -k | sed -e 's_^\([0-9]*\)_\1 KB_' | sort -n
49
27.01.2020, 19:27
  • 1
    , хорошим не должным быть установить что-то еще для получения результатов, мне нужен –  taranaki 03.03.2017, 21:07

Сойдите с ума с этим сценарием -

$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
27.01.2020, 19:27

К виду размером в МБ

du --block-size=MiB --max-depth=1 path | sort -n
-1
27.01.2020, 19:27
  • 1
    Пользователь хочет получить вывод du -h (человекочитаемый вывод) отсортированный численно. Вы не предоставляете ответ на это. Можно также хотеть связать учетную запись UNIX-SE с другими учетными записями, которые Вы имеете на других сайтах SE. –  Tonin 11.03.2013, 13:58

Этот сценарий еще легче:

for i in G M K; do du -h -d1 / | grep [0-9]$i | sort -n; done
-2
27.01.2020, 19:27

На OS X вы можете установить необходимые кернутилы через Homebrew:

brew install coreutils

С этим вы получите gsort, который включает в себя параметр командной строки -h.

6
27.01.2020, 19:27

Этот обрабатывает имена файлов пробелы или апострофы, и работает на системах, которые не поддерживают xargs -d или сортировка -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
27.01.2020, 19:27

Поскольку Mac OS X не имеет опции -h для сортировки -h , то я попробовал и узнал 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 * я увидел в ответе @Stefan, где также отображается итоговая сумма, и без обхода точки монтирования файловой системы, используя du -skcx *

4
27.01.2020, 19:27

для OSX

du -h -k  {PATH} | sort -n
-2
27.01.2020, 19:27

Теги

Похожие вопросы