Сортировка удобочитаемых размеров файлов

16

Как я могу отсортировать список, используя удобочитаемую сортировку по размеру файла, числовую сортировку, которая принимает во внимание идентификатор размера (G, M, K)? Могу ли я отсортировать " du -sh" вывод, например?

Проблема: рассмотрите проблему перечисления файлов / папок и сортировки их по размеру. Вы можете достичь этого, запустив:

du -s * | sort -n

Здесь перечислены файлы / папки, отсортированные по размеру. Однако значение печатного размера указывается в байтах (или мегабайтах, или гигабайтах, если вы выберете).

Было бы желательно иметь возможность сортировки на основе удобочитаемых значений, чтобы я мог выполнить что-то аналогичное

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

И папка 1,5 ГБ появляется после 2.0M.

notnoop
источник

Ответы:

29

Используйте GNU coreutils> = 7.5:

ду-хс * | сортировать -h

(Взято из этого вопроса о неисправности сервера )

Man страница

Изменить: вы можете проверить свои версии, используя du --versionи sort --versionесли вы используете версии GNU. Если вы используете homebrew, вам может понадобиться использовать gduи gsort.

Джейсон Аксельсон
источник
8
OSX не имеет этой опции. Вы можете использовать homebrew brew install coreutils(который добавляет все команды coreutils к «g»). Вы можете тогда сделать gdu -hs * | gsort -h.
dsummersl
1
Просто чтобы прояснить точку зрения @ dsummersl: du -hs *на Mac OS X работает нормально, но sort -hвозвращается sort: invalid option -- h. Можно также установить пакет coreutils через MacPorts, как описано здесь .
Jvriesem
3

Если вы просто беспокоитесь о файлах размером более 1 МБ, как вам кажется, вы можете использовать эту команду для их сортировки и использовать awk для преобразования размера в МБ:

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

Опять же, это округляет размеры до ближайшего МБ. Вы можете изменить его, преобразовав в единицу по вашему выбору.

Патрик
источник
Это похоже на: du -sm * | sort -n. -s/ -gДелает duразмеры выходных в мегабайтах / гигабайт.
Notnoop
Для MB вы должны разделить еще на 1024. Так и будетint($1 / (1024 * 1024))
Пратик Хадлоя
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

первый.

0x89
источник
1

дю -ск * | сортировать -n | awk '{print $ 2}' | пока читаешь ф; do du -sh "$ f"; сделано


источник
1

Эта команда будет сортировать по размеру в МБ

du --block-size=MiB --max-depth=1 path | sort -n
lukmansh
источник
Это уже то, что пользователь делает на самом деле, он просто не привел пример с MiB, но упомянул об этом. Что он / она ищет, так это уметь сортировать при использовании -hфлага для du.
Тонин
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

Я уверен, что есть способ повторно использовать шаблон регулярных выражений, поэтому я выполняю матч только один раз и заменяю на месте, но пока не знаю, как это сделать :)

Йенс Бодал
источник