Запуск du в папках с временным сдвигом дает разные результаты

361
Paolo

Моя цель - найти, какие файлы / папки занимают больше всего места в 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 или более папок моментальных снимков, и я хочу углубиться только в одну.

1

2 ответа на вопрос

1
xenoid

Очевидно, 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
Kamil Maciorowski

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

Должно быть, это всего лишь один duпроцесс, и он пытается быть умным.

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

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

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

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

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

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

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

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

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

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(интерактивный инструмент) и его поведение.

Похожие вопросы