1

Моя цель - найти, какие файлы / папки занимают больше всего места в snapshot из timeshift инструмента резервного копирования, но при использовании du он дает разные результаты:

# du -hs *
18G     2018-09-21_16-14-57
910M    2018-10-06_07-04-27

Только вторая папка

# du -hs 2018-10-06_07-04-27
18G     2018-10-06_07-04-27

Результат, который мне нужен, - это 910M, который я затем хочу изучить, чтобы найти, какие папки / файлы занимают больше всего места в этом.
Почему du дает разные результаты? Как мне получить результат 910M?

Я знаю, что вторая папка полна жестких ссылок (именно так работает инструмент), но du не должен сообщать о разных размерах, поскольку * просто расширяет фактические имена папок в bash , не так ли?

Обновление: я только что попробовал # du -hd 2 * который кажется шагом в правильном направлении, но это не разумное решение, когда есть 20 или более папок со снимками, и я хочу углубиться только в одну.

2 ответа2

1

Очевидно, что du игнорирует иноды, которые уже учитывались в других каталогах, которые он посещал. Например, с вашим примером:

du -hs 2018-09-21_16-14-57 2018-10-06_07-04-27
du -hs 2018-10-06_07-04-27 2018-09-21_16-14-57

даст разные результаты.

Но в вашем случае это не должно иметь большого значения. Если файлы в папке соответствуют inode с несколькими ссылками, удаление их в этой папке ничего не изменит. ИМХО, вам следует сосредоточиться на inode, а не на каталогах (что означает не использовать параметр -s в du).

0

du не должен сообщать о разных размерах, поскольку * просто расширяется до фактических имен папок в Bash, не так ли?

Он должен, это еще только один du процесс , и он пытается быть умным.

Обоснование: Если бы du * не был умным, было бы трудно сделать это умным. С другой стороны легко, довольно просто сделать умного du "тупым". Если вам нужны полностью независимые результаты, просто запустите отдельные du -s для двух каталогов.

Несколько общих примеров использования отдельных du s:

for d in *; do du -hs "$d"; done
find . -exec du -hs {} \;

Они отличаются в деталях. Основанный на find можно настроить (например, начать с find . -type d …).

Также проверьте параметр --apparent-size если ваш du поддерживает его.

Другое дело, будет ли полезно сделать du "dumb" для вас, так как вы хотите "найти, какие файлы / папки занимают больше всего места". Другой ответ правильный:

Если файлы в папке соответствуют inode с несколькими ссылками, удаление их в этой папке ничего не изменит.

Умное поведение du кажется, больше соответствует вашим потребностям, чем "вынужденное" "тупое". Мой совет принять преимущество этого и факт du обрабатывают свои аргументы в данной последовательности. Это означает , что согласно отчетности размер самого последнего объекта, что вы получите , если вы удалите этот объект , и только этот объект (если он не содержит жесткие ссылки на еще одно место , где именно этот du не PEEK).

В вашем примере расширенная команда была, по-видимому:

du -hs 2018-09-21_16-14-57 2018-10-06_07-04-27

Результат говорит, что вы получите 910M если вы удалите только 2018-10-06_07-04-27 . Теперь попробуйте другую последовательность:

du -hs 2018-10-06_07-04-27 2018-09-21_16-14-57

Последняя строка вывода скажет вам, сколько места вы получите, если вы удалите только 2018-09-21_16-14-57 .

На вашем месте я бы также исследовал ncdu (интерактивный инструмент) и его поведение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .