Bash: как я могу перечислять размер каждого файла и каталога (рекурсивно) и сортировать по размеру decendingly?

Я обнаружил, что нет простого способа определить размер каталога в Bash?

Я хочу, чтобы при вводе ls -<some options>,

он может одновременно отображать всю сумму файла каталога рекурсивно и файлы и сортировать по порядку размера.

Возможно ли это?

Ответ 1

Просто перейдите в каталог и выполните следующую команду:

du -a --max-depth=1 | sort -n

ИЛИ добавить -h для считываемых человеком размеров и -r сначала напечатать более крупные каталоги/файлы.

du -a -h --max-depth=1 | sort -hr

Ответ 2

du -s * | sort -n

(это не будет показывать скрытые (.dotfiles) файлы)

Используйте du -sm для единиц Mb и т.д. Я всегда использую

du -smc * | sort -n

потому что общая строка (-c) окажется в нижней части по понятным причинам:)

PS:

  • См. комментарии для обработки dotfiles
  • Я часто использую, например, 'du -smc/home//| sort -n | tail ', чтобы понять, где сидят большие бит.

Ответ 3

Command

du -h --max-depth=0 * | sort -hr

Выход

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Описание

  • du отображает "использование диска"
  • h предназначен для "читаемых человеком" (оба, в порядке и в дю)
  • max-depth=0 означает, что du не будет отображать размеры вложенных папок (удалите это, если вы хотите показать все размеры каждого файла в каждой под-, подсетей,..., папке)
  • r для "обратного" (самый большой файл).

Ответ 4

По-видимому, параметр --max-depth отсутствует в Mac OS X версии команды du. Вместо этого вы можете использовать следующее.

du -h -d 1 | sort -n

Ответ 5

ls -S сортируется по размеру. Затем, чтобы показать размер, ls -lS показывает длинный (-l), отсортированный по размеру (-S). Я обычно добавляю -h, чтобы сделать чтение более легким, поэтому ls -lhS.

Ответ 6

Простой и быстрый:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* требует GNU Parallel.

Ответ 7

Думаю, я мог бы понять, что вы хотите сделать. Это даст отсортированный список всех файлов и всех каталогов, отсортированных по размеру и размеру содержимого содержимого в каталогах.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

Ответ 8

[улучшенная версия]
Это будет намного быстрее и точнее, чем исходная версия ниже, и выведет сумму всего размера файла текущего каталога:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

команда stat -c %s в файле вернет размер в байтах. Команда tr здесь используется для преодоления ограничений командной строки xargs (видимо, переход на xargs - это расщепление результатов на большее количество строк, нарушение логики моей команды). Следовательно, tr заботится о замене строки с знаком + (plus). sed имеет единственную цель - удалить последний знак + из результирующей строки, чтобы избежать сбоев от окончательной команды bc (basic calculator), которая, как обычно, делает математику.

Выступления: Я тестировал его в нескольких каталогах и более чем на 150 000 файлов вверх (текущее количество файлов в моем блоке fedora 15), что, по моему мнению, является удивительным результатом:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

На всякий случай, если вы хотите провести сравнение с командой du -sb /, оно выведет примерное использование диска в байтах (-b)

# du -sb /
12684646920 /

Как я и ожидал, это немного больше, чем мой расчет команды, потому что утилита du возвращает выделенное пространство каждого файла, а не фактическое потребляемое пространство.

[начальная версия]
Вы не можете использовать команду du, если вам нужно знать точный размер суммы вашей папки, потому что (в соответствии с ссылкой на man-страницу) du оценивает использование файлового пространства. Следовательно, это приведет вас к неправильному результату, приблизительному (возможно, близкому к размеру суммы, но скорее всего большему, чем реальный размер, который вы ищете).

Я думаю, что могут быть разные способы ответить на ваш вопрос, но это мое:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Он находит все файлы под. (с помощью любой другой директории), также включены скрытые файлы и (используя xargs) выводит их имена в одной строке, а затем создает подробный список, используя ls -l. Этот (иногда) огромный вывод передается по команде cut, и только пятое поле (-f5), которое является размером файла в байтах, берется и снова передается по каналу xargs, которое снова выводит одну строку размеров, разделенных пробелами. Теперь сделайте волшебство sed, которое заменяет каждое пустое место знаком плюса (+) и, наконец, bc (базовый калькулятор) выполняет математику.

Возможно, потребуется дополнительная настройка, и вы можете иметь команду ls, слишком жалующуюся на список аргументов.

Ответ 9

Еще одно простое решение.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

результат будет выглядеть как

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

изменение "du -s" на "du -sh" покажет человеческий читаемый размер, но мы не сможем сортировать в этом методе.

Ответ 10

вы можете использовать ниже, чтобы перечислять файлы по размеру du -h | sort -hr | Больше или du -h - max-depth = 0 * | sort -hr | более

Ответ 11

Я стараюсь использовать du простым способом.

du -sh */ | sort -n

Это дает мне представление о том, какие каталоги потребляют больше всего пространства. Затем я смогу выполнить более точные поиски.