Сложение размеров каталогов с использованием bash непоследовательно.

Вопрос или проблема

Сначала я получил общий размер папки /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-подобных системах и возможные проблемы, связанные с дублирующими данными. Надеюсь, это объяснение помогло вам лучше понять причины этой несостыковки. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...