Вопрос или проблема
Сначала я получил общий размер папки /my-downloads
:
$ du -sh /my-downloads
304G /my-downloads
Как видите, это 304G.
Затем я хотел узнать общий размер всех непосредственных директоров внутри папки /my-downloads
, используя awk
следующим образом:
$ find /my-downloads/* -maxdepth 1 -type d -exec du -sb {} \; | awk 'BEGIN {t_size=0} {t_size+=$1} END {print t_size / 1024 / 1024 / 1024 "GB"}'
350.309GB
Как видите, вывод отличается.
Мой вопрос: как так получается, что общий размер непосредственных директорий внутри папки /my-downloads
(не файлов) составил 350.309GB, что больше общего размера папки /my-downloads
, как сообщается командой du -sh /my-downloads
? Как мне объяснить это расхождение?
Спасибо.
Ответ или решение
Вопрос, который вы подняли, касается разности между суммарным объёмом директории и суммой объёмов её поддиректорий, и это на самом деле довольно распространённая проблема в среде Linux. Рассмотрим подробнее возможные причины этой несовпадающей информации и способы их объяснения.
1. Понятие дублирующих данных
Одной из возможных причин, по которой размер поддиректорий может превышать размер родительской директории, является наличие дублирующих данных. Если одна и та же информация хранится в нескольких поддиректориях, то командa du
для каждой поддиректории будет возвращать размер повторно, как будто это разные файлы, хотя они на самом деле могут быть одними и теми же файлами.
2. Рекомендации по использованию параметров du
Команда du
(disk usage) с разными параметрами может давать разные результаты. В вашем случае:
du -sh /my-downloads
Размечает размер всей директории, включая часто используемые скрытые файлы и сами поддиректории. При этом она может игнорировать некоторые временные файлы, если они не загружены или находятся в состоянии, которое позволяет их исключение.
В то время как использование find
с du -sb {}
вычисляет размер каждого элемента напрямую и может включать временные файлы или другие элементы, которые не приняты во внимание в общих подсчетах.
3. Исключения файлов в .git
или других скрытых директориях
Если поддиректории содержат скрытые файлы или скрытые директории (например, .git
), это также может привести к различиям в объёмах. Каждый из этих элементов будет подсчитан отдельно при помощи вашего скрипта, однако du -sh
может игнорировать их, если они были задействованы вне контекста общего размера.
4. Разные временные состояния хранения и блокировка
Также стоит учитывать, что во время вычисления размеры файлов могут изменяться. Например, если какие-то файлы активно изменяются, это может привести к отображению разных величин. Состояние на момент выполнения du -sh
и состояния, которые обрабатываются с помощью find
и du
, могут не совпадать.
5. Подводим итоги
Чтобы получить наиболее точную оценку размера директории и её поддиректорий, вы можете использовать вариант без использования find
или синтаксиса, который более централизованно обрабатывает данные. Вот пример:
du -sh /my-downloads/* | awk '{sum += $1} END {print sum " GB"}'
Этот подход помочь дополнительно избежать возможных коллизий данных.
Заключение
В итоге, разница в размере между /my-downloads
и суммарным размером всех поддиректорий — это не редкость. Важно понимать, как именно работает du
, сам процесс хранения данных в Unix-подобных системах и возможные проблемы, связанные с дублирующими данными. Надеюсь, это объяснение помогло вам лучше понять причины этой несостыковки. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их!