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

10

Есть ли способ быстро получить точный размер для каталога (включая, рекурсивно, все его подкаталоги)? Я не хочу размеры подкаталогов, я просто имею в виду, что они должны быть рекурсивно включены в общий размер отчета.

В противном случае, способ получить приблизительный размер? Я думаю что-то вроде этого, dfчто дает быстрый ответ для всей файловой системы, но на этот раз для определенного каталога (и его подкаталогов).

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

Маркус Юний Брут
источник
Использование du- единственный метод, который мне известен. Проблема заключается в том, что данные распределены по всей иерархии, поэтому их необходимо подсчитать с помощью инструмента для получения подсчета.
SLM

Ответы:

15

Я считаю это весьма полезным.

du -sm Directory

или получить разбивку внутри каталогов

du -sm Directory/*

а затем с видом, если у него есть много subdirs

du -sm Directory/* | sort -n 

Причина, по которой я использую опцию -m, заключается в том, что я получаю вывод в мегабайтах. Я считаю, что это легче сравнивать визуально (когда я не получаю смесь единиц, например, сравниваю 999 КБ и 1 МБ против 999000 МБ и 1000000 МБ), дополнительное преимущество заключается в том, что вы можете передавать выходные данные в сортировку.

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

du -sm Directory/* | sort -nr > ~/cacheDu.log &

Обратите внимание на обратную сортировку, так что большие находятся в начале. Добавьте это к запуску cron каждые n минут.

Затем с псевдонимом Ducache у вас достаточно современное использование каталогов.

export alias ducache='head -n 15 ~/cacheDu.log'
X Тянь
источник
@X Tian см. Мой комментарий к ответу Гленна Джекмана
Маркус Юниус Брутус
Принято, поэтому я использую -m и сортирую
X Tian
3
Помните shopt -s dotglob, иначе du -sm Directory/*скрытые файлы / каталоги не будут учитываться.
Дмитрий Григорьев
@XTian извините, но я не смог, поэтому некоторые команды, пожалуйста, помогите.
Maveň ツ
Я получил это отсюда
Maveň ツ
5
du -sh "$dir"

предоставит вам сводную информацию об общем размере в формате «человек».


Так как вы искали альтернативу du, я попробовал find, но это точно так же:

$ find . -printf "%s\n" | { 
    sum=0
    while read size; do ((sum+=size)); done
    echo $sum
}
122865202884
$ du -sb .
122865202884    .
Гленн Джекман
источник
Спасибо, я знаю об этом, но это duзанимает слишком много времени, так как это дает точный результат. Я надеялся на инструмент / команду, которая обеспечивает быстрый и грязный приблизительный ответ.
Маркус Юний Брут
Существует, dfно это работает на всей файловой системе.
Гленн Джекман
1

Возможно, вам не понравится мой ответ, но я думаю, что лучший способ сделать то, что вы хотите, это регулярно запускать "du-s" в фоновом режиме, используя cron, и сохранять результат в файле. Затем, когда вы хотите приблизительное значение, используйте значение из файла. Вы сами решаете, как часто бегать по дю. Я не вижу более быстрого способа получить ценность. Команда du эффективна для того, что она делает.

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

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

Роберт Джейкобс
источник
0

Он не совсем соответствует вашим потребностям (не однострочный), но гораздо проще, чем другие решения:

du -a -h | sort -hr | head -2

Эта команда даст вам размер каталога и подкаталога и размер самого большого файла или подкаталога в текущем каталоге.

PS: Это head -2в том случае, если подкаталог занимает все место текущего каталога и прослушивается перед текущим.

Nodulaire
источник