Удобный для чтения, рекурсивный, отсортированный список самых больших файлов - PullRequest
6 голосов
/ 06 марта 2011

Как лучше всего печатать список 10 самых больших файлов в оболочке POSIX?Должно быть что-то более элегантное, чем мое текущее решение:

DIR="."
N=10
LIMIT=512000

find $DIR -type f -size +"${LIMIT}k" -exec du {} \; | sort -nr | head -$N | perl -p -e 's/^\d+\s+//' | xargs -I {} du -h {}

, где LIMIT - это пороговое значение размера файла, чтобы ограничить результаты поиска.

1 Ответ

6 голосов
/ 07 марта 2011

Используется awk для создания дополнительных столбцов для ключей сортировки.Звонит du только один раз.Вывод должен выглядеть точно так же, как du.

. Я разбил его на несколько строк, но его можно объединить в одну строку.

du -h |
  awk '{printf "%s %08.2f\t%s\n", 
    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 для группировки по единицам, если нет единицы (размер меньше 1 КБ), тогда совпадения нет, и возвращается ноль (идеально!)
  • вывести новые поля - единица измерения, значение (для правильной работы альфа-сортировки она дополнена нулями, фиксирована)длина) и исходная строка
  • индексировать последний символ поля размера
  • вытащить числовую часть размера
  • отсортировать результаты, отбросить лишние столбцы

Попробуйте без команды cut посмотреть, что она делает.

Редактировать:

Вот версия, которая выполняет сортировку в скрипте AWK и ненужно сократить (требуется GNU AWK (gawk) для поддержки asorti):

du -h |
   awk '{idx = sprintf("%s %08.2f %s", 
         index("KMG", substr($1, length($1))),
         substr($1, 0, length($1)-1), $0);
         lines[idx] = $0}
    END {c = asorti(lines, sorted);
         for (i = c; i >= 1; i--)
           print lines[sorted[i]]}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...