- Как отсортировать вывод du -h по размеру
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
- Ответ 15
- Ответ 16
- Ответ 17
- Ответ 18
- Ответ 19
- Ответ 20
- Ответ 21
- Ответ 22
- Ответ 23
- Ответ 24
- Размеры папок и дисков в Linux. Команды df и du
- Примечание:
- Опция -h
- Размер конкретного диска
- Размер папок на диске (du)
- Просмотр размера текущей папки
- Посмотреть размеры всех папок
- Отобразить размеры всех вложенных папок
- Отсортировать папки по объёму
Как отсортировать вывод du -h по размеру
Мне нужно получить список вывода, который может читать человек.
Однако у du нет опции «сортировать по размеру», sort не работает с флагом, понятным человеку.
Например:
du | sort -n -r
Выводит отсортированное использование диска по размеру (по убыванию):
du |sort -n -r
65108 .
61508 ./dir3
2056 ./dir4
1032 ./dir1
508 ./dir2
Однако запуск его с флагом, понятным для человека, не выполняет сортировку должным образом:
du -h | sort -n -r
508K ./dir2
64M .
61M ./dir3
2.1M ./dir4
1.1M ./dir1
Кто-нибудь знает способ сортировки du -h по размеру?
Ответ 1
Начиная с версии GNU coreutils 7.5, выпущенной в августе 2009 года, sort допускает параметр -h, который позволяет использовать числовые суффиксы, подобные тем, что выдает du -h:
du -hs * | sort -h
Если же использовать сортировку, которая не поддерживает -h, можно установить GNU Coreutils. Например, на старой версии Mac OS X:
rew install coreutils
du -hs * | gsort -h
Из sort руководства:
-h, —human-numeric-sort compare human readable numbers (e.g., 2K 1G)
Ответ 2
Есть очень полезный инструмент под названием ncdu, который я использую для поиска и удаления этих надоедливых папок и файлов, которые занимают много места на диске. Он работает в консоли, быстрый и легкий, и имеет пакеты для всех основных дистрибутивов.
Ответ 3
Отсортируйте человекочитаемый вывод du -h с помощью другого инструмента. Например, Perl!
du -h | perl -e «sub h<%h=(K=>10,M=>20,G=>30);($n,$u)=shift=~/([0-9.]+)(\D)/;
return $n*2**$h>print sorth($a)><>;»
Можно разделить на несколько строк, чтобы поместить на экране, или оставить как есть, он будет работать в любом случае.
Вывод:
4.5M .
3.7M ./colors
372K ./plugin
128K ./autoload
100K ./doc
100K ./syntax
Окончательный результат следующий:
perl -e»%h=map«du -h»;die@h»
Ответ 4
У меня тоже была такая проблема, и сейчас я использую другой способ:
du -scBM | sort -n
Это не даст масштабированных значений, но всегда будет отображать размер в мегабайтах. Это не идеально, но для меня это лучше, чем ничего.
Ответ 5
- Изменить du для сортировки перед отображением.
- Изменить sort для поддержки человечески понятных размеров для числовой сортировки.
- Постобработка вывода из sort для изменения базового вывода на понятный человеку.
Ответ 6
Нашел это сообщение в другом месте. Поэтому этот сценарий оболочки будет делать то, что вы хотите, не вызывая du для этого дважды. Он использует awk для преобразования необработанных байтов в человекочитаемый формат. Конечно, форматирование немного отличается (все печатается с точностью до одного десятичного знака).
#/bin/bash
du -B1 | sort -nr |awk ‘
hum[1024**3]=»G»;hum[1024**2]=»M»;hum[1024]=»K»;
for (x=1024**3; x>=1024; x/=1024)
if (sum>=x) < printf "%.1f%s\t\t",sum/x,hum[x];print $2;break
>>>’
Запуск этой программы в моем каталоге .vim дает результат:
4.4M .
3.6M ./colors
372.0K ./plugin
128.0K ./autoload
100.0K ./syntax
100.0K ./doc
Ответ 7
Эта версия использует awk для создания дополнительных столбцов для ключей сортировки. Она вызывает du только один раз. Вывод должен выглядеть точно так же, как в du.
Я разбил его на несколько строк, но его можно собрать и в одну.
du -h |
awk ‘
index(«KMG», substr($1, length($1))),
substr($1, 0, length($1)-1), $0>’ |
sort -r | cut -f2,3
Пояснения:
BEGIN — создает строку для индекса, чтобы подставить 1, 2, 3 для K, M, G для группировки по единицам, если нет единицы (размер меньше 1K), то нет совпадения и возвращается ноль (идеально!).
Выводит новые поля — единицу измерения, значение (для правильной работы альфа-сорта с добавкой нуля, фиксированной длины) и исходную строку.
Проиндексировать последний символ поля размера.
Вытащить числовую часть размера.
Сортирует результаты, отбросывает лишние столбцы.
Попробуйте без команды cut, чтобы увидеть, что она делает.
Вот версия, которая выполняет сортировку внутри сценария AWK и не требует команды cut:
du -h |
awk ‘
index(«KMG», substr($1, length($1))),
substr($1, 0, length($1)-1), $0);
lines[idx] = $0>
END
for (i = c; i >= 1; i—)
print lines[sorted[i]]>’
Ответ 8
Вот пример, который показывает каталоги в более компактной обобщенной форме. Он обрабатывает пробелы в именах каталогов.
% du -s * | sort -rn | cut -f2- | xargs -d «\n» du -sh
53G projects
21G Desktop
7.2G VirtualBox VMs
3.7G db
3.3G SparkleShare
2.2G Dropbox
272M apps
47M incoming
14M bin
5.7M rpmbuild
68K vimdir.tgz
Сортировка файлов по размеру в МБ:
du —block-size=MiB —max-depth=1 path | sort -n
Ответ 9
У меня есть простая, но полезная обертка для du на языке python под названием dutop. Обратите внимание, что мы (сопровождающие coreutils) рассматриваем возможность добавления функциональности для сортировки «человеческого» вывода напрямую.
Ответ 10
$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F’\t’ -lane ‘print format_bytes($F[0]).»\t».$F[1]’
Мне начинает нравиться perl. Возможно, вам придется сделать так:
$ cpan Number::Bytes::Human
Ответ 11
Этот фрагмент был заимствован у «Жан-Пьера» с http://www.unix.com/shell-programming-scripting/32555-du-h-sort.html . Можно ли верить ему?
du -k | sort -nr | awk ‘
BEGIN
split(«KB,MB,GB,TB», Units, «,»);
>
u = 1;
while ($1 >= 1024)
$1 = $1 / 1024;
u += 1
>
$1 = sprintf(«%.1f %s», $1, Units[u]);
print $0;
>
‘
Ответ 12
Используйте флаг «-g»:
-g, —general-numeric-sort
compare according to general numerical value
В моем каталоге /usr/local выводится примерно так:
$ du |sort -g
0 ./lib/site_ruby/1.8/rubygems/digest
20 ./lib/site_ruby/1.8/rubygems/ext
20 ./share/xml
24 ./lib/perl
24 ./share/sgml
44 ./lib/site_ruby/1.8/rubygems/package
44 ./share/mime
52 ./share/icons/hicolor
56 ./share/icons
112 ./share/perl/5.10.0/YAML
132 ./lib/site_ruby/1.8/rubygems/commands
132 ./share/man/man3
136 ./share/man
156 ./share/perl/5.10.0
160 ./share/perl
488 ./share
560 ./lib/site_ruby/1.8/rubygems
604 ./lib/site_ruby/1.8
608 ./lib/site_ruby
Ответ 13
Нашел это в сети . похоже, работает нормально:
du -sh * | tee /tmp/duout.txt | grep G | sort -rn ; cat /tmp/duout.txt | grep M | sort -rn ; cat /tmp/duout.txt | grep K | sort -rn ; rm /tmp/duout.txt
Ответ 14
Ответ 15
Я изучил awk, придумав вчера этот пример. Это заняло некоторое время, но было очень весело, и я научился использовать awk.
Он запускает du один раз, и его вывод очень похож на du -h
du —max-depth=0 -k * | sort -nr | awk ‘< if($1>=1024*1024) else if($1>=1024) else ; if(size<10) format="%.1f%s"; else format="%.0f%s"; res=sprintf(format,size,unit); printf "%-8s %s\n",res,$2 >‘
Данный пример показывает числа меньше 10 с одной десятичной точкой.
Ответ 16
Вот простой метод, который я использую — низкое использование ресурсов и делает то, что нужно:
du —max-depth=1 | sort -n | awk ‘BEGIN ‘
0 MB ./etc
1 MB ./mail
2 MB ./tmp
123 MB ./public_html
Ответ 17
Если вам нужно обрабатывать пробелы, можно использовать такой вариант:
du -d 1| sort -nr | cut -f2 | sed ‘s/ /\\ /g’ | xargs du -sh
Оператор sed поможет решить проблемы с именами папок, как в Application Support.
Ответ 18
Другое awk решение:
du -k ./* | sort -nr |
awk ‘
= 1024)
$1 = sprintf(«%-4.2f%s», $1, size[x]); print $0;>’
[jaypal~/Desktop/Reference]$ du -k ./* | sort -nr | awk ‘= 1024) $1 = sprintf(«%-4.2f%s», $1, size[x]); print $0;>’
15.92MB ./Personal
13.82MB ./Personal/Docs
2.35MB ./Work Docs
1.59MB ./Work Docs/Work
1.46MB ./Personal/Raa
584.00KB ./scan 1.pdf
544.00KB ./Personal/Resume
44.00KB ./Membership.xlsx
16.00KB ./Membership Transmittal Template.xlsx
Ответ 19
Вот пример
du -h /folder/subfolder —max-depth=1 | sort -hr
Вывод:
233M /folder/subfolder
190M /folder/subfolder/myfolder1
15M /folder/subfolder/myfolder4
6.4M /folder/subfolder/myfolder5
4.2M /folder/subfolder/myfolder3
3.8M /folder/subfolder/myfolder2
Можно добавить, | head -10, чтобы найти первые 10 или любое количество подпапок в указанном каталоге.
Ответ 20
du -sk /var/log/* | sort -rn | awk » | xargs -ia du -hs «a»
Ответ 21
Используйте следующий сценарий bash:
#!/bin/bash
# File: duf.sh
# list contents of the current directory by increasing
#+size in human readable format
# for some, «-d 1» will be «—maxdepth=1»
du -k -d 1 | sort -g | awk ‘
if($1 <1024)
printf(«%.0f KB\t%s»,$1,$2);
else if($1 <1024*1024)
printf(«%.1f MB\t%s»,$1/1024,$2);
else
printf(«%.1f GB\t%s»,$1/1024/1024,$2);
>’
Ответ 22
Здесь много ответов, многие из которых дублируются. Я вижу три тенденции: пересылка через второй вызов du, использование сложного кода shell/awk и использование других языков.
Вот POSIX-совместимое решение с использованием du и awk, которое должно работать на любой системе.
Я использовал немного другой подход, добавив -x, чтобы убедиться, что мы остаемся в той же файловой системе (мне эта операция нужна только в случае нехватки дискового пространства, так зачем удалять то, что я смонтировал в этом дереве FS или переместил и соединил обратно?) . Отображает последовательный вывод, чтобы облегчить визуальный разбор. В этом случае я обычно предпочитаю не сортировать, чтобы лучше видеть иерархическую структуру.
sudo du -x | awk ‘
$1 > 2^20 < s=$1; $1=""; printf "%7sG%s\n", sprintf("%.2f",s/2^21), $0 >‘
(Поскольку это последовательный вывод, вы можете добавить | sort -n, если вам действительно нужен отсортированный результат).
Эта команда, отфильтрует любой каталог, чье (суммарное) содержимое не превышает 512 МБ, а затем отображдает размеры в гигабайтах. По умолчанию du использует размер блока 512 байт (поэтому условие awk в 220 блоков равно 512 МБ, а его делитель 221 преобразует единицы измерения в ГБ — мы могли бы использовать du -kx с $1 > 512*1024 и s/1024^2 для лучшей человекочитаемости). Внутри условия awk мы устанавливаем s в размер, чтобы можно было удалить его из строки ($0). При этом сохраняется разделитель (который сворачивается в один пробел), поэтому конечный %s представляет собой пробел, а затем имя объединенного каталога. %7s округляет размер %.2f GB (увеличивает до %8s, если у вас >10TB).
В отличие от большинства приведенных здесь решений, это правильно поддерживает каталоги с пробелами в именах (хотя все решения, включая это, будут неправильно обрабатывать имена каталогов, содержащие переносы строк).
Ответ 23
По крайней мере, с помощью обычных инструментов это будет трудно сделать из-за формата человекочитаемых чисел (обратите внимание, что sort все делает правильно, поскольку сортирует числа — 508, 64, 61, 2, 2 — он просто не может сортировать числа с плавающей запятой с дополнительным множителем).
Я бы попробовал сделать все наоборот — использовать вывод «du | sort -n -r», а затем преобразовать числа в человекочитаемый формат с помощью какого-нибудь скрипта или программы.
Ответ 24
Вы можете попробовать следующее:
for i in «du -s * | sort -n | cut -f2»
do
du -h $i;
done
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Размеры папок и дисков в Linux. Команды df и du
Для просмотра свободного и занятого места на разделах диска в Linux можно воспользоваться командой df.
Первым делом можно просто ввести команду df без каких-либо аргументов и получить занятое и свободное место на дисках. Но по умолчанию вывод команды не очень наглядный — например, размеры выводятся в КБайтах (1К-блоках).
Примечание:
df не отображает информацию о не смонтированных дисках.
Опция -h
Опция -h (или —human-readable) позволяет сделать вывод более наглядным. Размеры выводятся теперь в ГБайтах.
Размер конкретного диска
Команде df можно указать путь до точки монтирования диска, размер которого вы хотите вывести:
Размер папок на диске (du)
Для просмотра размеров папок на диске используется команда du. Если просто ввести команду без каких либо аргументов, то она рекурсивно проскандирует вашу текущую директорию и выведет размеры всех файлов в ней. Обычно для du указывают путь до папки, которую вы хотите проанализировать. Если нужно просмотреть размеры без рекурсивного обхода всех папок, то используется опция -s (—summarize). Также как и с df, добавим опцию -h (—human-readable).
Просмотр размера текущей папки
Чтобы показать объем просто одного текущего каталога (со всеми вложенными файлами + подкаталогами) подойдёт команда du с ключиком -sh.
Вот пример, как определить размер директории данного сайта:
Посмотреть размеры всех папок
Если нужно посчитать вес всех директорий плюс файлы — добавляем звёздочку:
Отобразить размеры всех вложенных папок
Чтобы проверить информацию в том числе вообще по всем папкам, вместе со вложенными — понадобится самый короткий вариант:
Внимание: если такой случайно запустить в корне на объёмном диске с большим количеством информации — лучше сразу жмите CTRL-C, т.к. во-первых, иначе придётся сильно подождать 😉 , во-вторых, десятки-сотни экранов информации будут бессмысленными. Потому эта простая команда должна использоваться лишь для, соответственно, простых случаев.
Отсортировать папки по объёму
Покажет объём в килобайтах с сортировкой — самые большие папки/файлы сверху. Если нужно в мегабайтах:
К сожалению более удобный ключик h («human» — автовыбор кило-мега-гига) в данном случае (du -sh *| sort -nr) не подойдёт, т.к. сортировка идёт по «числам» (не учитывая, что это KB/MB/GB). Для этого придётся использовать длинную команду:
du -s *|sort -nr|cut -f 2-|while read a;do du -hs $a;done