Я обнаружил, что нет простого способа определить размер каталога в Bash?
Я хочу, чтобы при вводе ls -<some options>
,
он может одновременно отображать всю сумму файла каталога рекурсивно и файлы и сортировать по порядку размера.
Возможно ли это?
Я обнаружил, что нет простого способа определить размер каталога в Bash?
Я хочу, чтобы при вводе ls -<some options>
,
он может одновременно отображать всю сумму файла каталога рекурсивно и файлы и сортировать по порядку размера.
Возможно ли это?
Просто перейдите в каталог и выполните следующую команду:
du -a --max-depth=1 | sort -n
ИЛИ добавить -h для считываемых человеком размеров и -r сначала напечатать более крупные каталоги/файлы.
du -a -h --max-depth=1 | sort -hr
du -s * | sort -n
(это не будет показывать скрытые (.dotfiles) файлы)
Используйте du -sm
для единиц Mb и т.д. Я всегда использую
du -smc * | sort -n
потому что общая строка (-c
) окажется в нижней части по понятным причинам:)
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
для "обратного" (самый большой файл).По-видимому, параметр --max-depth
отсутствует в Mac OS X версии команды du
. Вместо этого вы можете использовать следующее.
du -h -d 1 | sort -n
ls -S
сортируется по размеру. Затем, чтобы показать размер, ls -lS
показывает длинный (-l
), отсортированный по размеру (-S
). Я обычно добавляю -h
, чтобы сделать чтение более легким, поэтому ls -lhS
.
Простой и быстрый:
find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n
* требует GNU Parallel.
Думаю, я мог бы понять, что вы хотите сделать. Это даст отсортированный список всех файлов и всех каталогов, отсортированных по размеру и размеру содержимого содержимого в каталогах.
(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
[улучшенная версия]
Это будет намного быстрее и точнее, чем исходная версия ниже, и выведет сумму всего размера файла текущего каталога:
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
, слишком жалующуюся на список аргументов.
Еще одно простое решение.
$ 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" покажет человеческий читаемый размер, но мы не сможем сортировать в этом методе.
вы можете использовать ниже, чтобы перечислять файлы по размеру du -h | sort -hr | Больше или du -h - max-depth = 0 * | sort -hr | более
Я стараюсь использовать du простым способом.
du -sh */ | sort -n
Это дает мне представление о том, какие каталоги потребляют больше всего пространства. Затем я смогу выполнить более точные поиски.