У меня есть файловая система, которая имеет пару миллионов файлов, и я хотел бы увидеть рекурсивное распределение размеров файлов в определенном каталоге. Я чувствую, что это вполне выполнимо с некоторыми bash / awk фу, но может использовать руку. В основном я хотел бы что-то вроде следующего:
1KB: 4123
2KB: 1920
4KB: 112
...
4MB: 238
8MB: 328
16MB: 29138
Count: 320403345
Я чувствую, что это не должно быть слишком плохо, учитывая цикл и некоторый условный размер файла log2 foo, но я не могу этого достичь.
Связанный вопрос: Как я могу найти файлы, которые больше / меньше, чем x байтов? ,
linux
command-line
bash
unix
notpeter
источник
источник
ls
afind
. Я возвращаю все обратно, как было.xargs
это значительно быстрее , чем-exec
, поэтому я использовал этот метод.Основываясь на ответе garyjohn, вот одна строка, которая также форматирует вывод в удобочитаемый для человека текст:
Вот расширенная версия этого:
В первом
awk
я определил минимальный размер файла, чтобы собрать все файлы размером менее 1 КБ в одном месте. Во второмawk
функцияhuman(x)
определена для создания удобочитаемого размера. Эта часть основана на одном из ответов здесь: /unix/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -как-дю-LS1Пример вывода выглядит так:
источник
Попробуй это:
ВЫХОД :
ОБЪЯСНЕНИЕ:
find . -type f -exec ls -lh {} \;
: достаточно просто, найдите файлы в текущем каталоге и запуститеls -lh
на нихmatch($5,/([0-9.]+)([A-Z]+)/,k);
: это извлечет размер файла и сохранит каждое совпадение в массивk
.if(!k[2]){print "1K"}
: еслиk[2]
не определено, размер файла <1K. Поскольку я полагаю, что вас не волнуют такие крошечные размеры, скрипт будет печатать1K
для всех файлов, размер которых <= 1К.else{printf "%.0f%s\n",k[1],k[2]}
: если файл больше 1 КБ, округлите размер файла до ближайшего целого числа и напечатайте вместе с его модификатором (K, M или G).sort | uniq -c
: подсчитать количество напечатанных строк (размер файла).sort -hk 2
: сортировка по второму полю в удобочитаемом формате. Таким образом,7G
сортируется после8M
.источник