Сортування файлів, доступних для читання людей


16

Як я можу сортувати список за допомогою читабельного для людей сортування файлів, чисельного сортування, який враховує ідентифікатор розміру (G, M, K)? Чи можу я сортувати du -shвихідний приклад, наприклад?

Проблема: Розгляньте проблему переліку файлів / папок та сортування їх за розміром. Ви можете досягти цього, запустивши:

du -s * | sort -n

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

Хочеться мати можливість сортувати на основі читабельних для людини значень, тому я можу запустити щось аналогічне

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

А папка 1,5 Гб з'явиться після 2,0М.

Відповіді:



29

Використовуйте GNU coreutils> = 7,5:

du -hs * | сортувати -h

(Взято з цього серверного запитання за замовчуванням )

Сторінка людини

Редагувати: Ви можете перевірити свої версії за допомогою du --versionта, sort --versionякщо ви використовуєте версії GNU. Якщо ви користуєтеся домашньою мовою, можливо, вам доведеться використовувати 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

Для МБ вам потрібно розділити на 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

спочатку.


1

дю -ск * | сортувати -n | awk '{print $ 2}' | при читанні f; робити дю -ш "$ f"; зроблено


1

Ця команда буде сортувати за розміром у МБ

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

Це вже те, що користувач насправді робить, він / вона просто не наводив приклад з MiB, але згадував про це. Те, що він / вона шукає, - це можливість сортувати при використанні -hпрапора до du.
Тонін

0

Я опинився тут, оскільки намагався сортувати щось інше, що поєднувало MB та GB в одному випуску, і я не міг це контролювати.

$NFвикористовується, оскільки #GBабо #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

Я впевнений, що є спосіб повторно використовувати схему регулярних виразів, тому я виконую матч лише один раз і замінюю на місці, але я ще не знаю, як це зробити :)

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