Как лучше всего напечатать список 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 ответ
Редактировать:
Использование утилит Gnu (du
и sort
):
du -0h | sort -zrh | tr '\0' '\n'
Это использует нулевой разделитель для передачи информации между du
и sort
и использует tr
для преобразования нулей в символы новой строки. Пустые значения позволяют этому конвейеру обрабатывать имена файлов, которые могут включать символы новой строки. Обе опции -h
заставляют вывод быть в удобочитаемой форме.
Оригинал:
Это использует 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
Пояснение:
- НАЧАЛО - создать строку для индексации для замены 1, 2, 3 на К, М, Г для группировки по единицам, если единицы нет (размер меньше 1К), то совпадения нет и возвращается ноль (идеально! )
- вывести новые поля - единицу измерения, значение (чтобы альфа-сортировка работала правильно, она дополнена нулями, фиксированная длина) и исходная строка
- индексировать последний символ поля размера
- вытащить числовую часть размера
- отсортировать результаты, отбросить лишние столбцы
Попробуйте без команды cut
, чтобы увидеть, что она делает.
Редактировать:
Вот версия, которая выполняет сортировку в сценарии AWK и не нуждается в вырезании (требуется GNU AWK (gawk
) для поддержки asorti
):
du -h0 |
gawk 'BEGIN {RS = "\0"}
{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]]}'
Изменить: добавлено разделение нулевых записей для обработки потенциальных имен файлов, которые включают новые строки. Требуется GNU du
и gawk
.
awk: calling undefined function asorti input record number 75, file source line number 5
gawk
) требуется для asorti
.
Похожие вопросы
Связанные вопросы
Новые вопросы
linux
ВНИМАНИЕ: Все вопросы по Linux должны быть связаны с программированием; те, которые не будут закрыты. Используйте этот тег, только если ваш вопрос касается программирования с использованием API-интерфейсов Linux или поведения, специфичного для Linux, а не только потому, что вы запускаете свой код в Linux. Если вам нужна поддержка Linux, вы можете попробовать https://unix.stackexchange.com или сайт Stack Exchange конкретного дистрибутива Linux, например https://askubuntu.com или https://elementaryos.stackexchange.com/.
du
не сортирует результаты.