Используя rsync --link-dest
для экономии места снимки , как я могу выяснить, сколько места я фактически сэкономил? Или более общий:
Как выяснить , сколько места каталога использует рассматривать только файлы, которые не hardlinked в другом месте за пределами структуры каталогов? По-разному спрашивается: сколько места будет на самом деле освобождено после удаления этого каталога? (
du -hs
будет лежать. Может быть включено пространство, необходимое для самих жестких ссылок)
disk-usage
hard-link
Тобиас Кинцлер
источник
источник
du
считает размеры файлов только один раз, даже если они жестко связаны, если вы не используете параметр-l
/--count-links
. Вы запускаетеdu
все дерево дважды с этой опцией и без нее, и разница между размерами должна заключаться в том, сколько места вы сэкономили во всех каталогах.Ответы:
Предполагая, что нет внутренних жестких ссылок (то есть каждый файл с более чем одной жесткой ссылкой связан вне дерева), вы можете сделать:
РЕДАКТИРОВАТЬ И вот что я набросал в комментарии, применил. Только без
du
; Слава @StephaneChazelas для замечанийdu
не нужна. Объяснение в конце.Что мы делаем, это создаем строку с использованием диска (в КБ) каждого соответствующего файла, разделенных знаком плюс. Затем мы кормим это большое дополнение к
bc
.Первый
find
вызов делает это для каталогов.Второй
find
выводит количество ссылок, индекс и использование диска. Мы передаем этот список черезsort | uniq -c
чтобы получить список (количество появлений в дереве, количество ссылок, индекс, использование диска).Мы передаем этот список через
awk
, и, если первое поле (количество появлений) больше или равно второму (количество жестких ссылок), то есть нет ссылок на этот файл извне дерева, выведите четвертое поле ( использование диска) со знаком плюс и обратной косой чертой.Наконец, мы выводим a
0
, поэтому формула синтаксически верна (в+
противном случае это будет en ) и передаем ееbc
. Уф.(Но я бы использовал более простой первый метод, если он дает достаточно хороший ответ.)
источник
find
для печати список всех файлов с их инодами и количеством ссылок; затем некоторая комбинация,sort | uniq -c
чтобы узнать, сколько раз каждый инод появляется в дереве, затем отфильтровать те, у которых число ссылок превышает количество появлений ... и затем передать этот списокdu
. Но если требование выполнено, лучше сэкономить.du
был-d
параметр, похожий наls
's ...btrfs
файловых системах количество ссылок на каталоги всегда1
, поэтому вам нужно добавить! -type d
По сути, вам нужно получить номера инодов и количество ссылок для всех файлов (не-каталогов), сравнить это количество ссылок с количеством вхождений каждого инода и, если они различаются, исключить файл.
Предполагая, что они все в одной файловой системе, что-то вроде этого должно работать (с GNU find):
источник
%k
сообщил. Это здорово,du
совсем не нужно! Я обновлю свой ответ, когда вернусь домой. Благодарность!du
фактически не будет лгать;) Он анализирует каталог, который ему дается, считая только первые из всех жестких ссылок, указывающих на тот же инод, с которым он сталкивается.Если вы спросите,
du
что он видит только в одном каталоге, ему все равно, что есть другие жесткие ссылки, указывающие на то же содержимое:Теперь поместите его в одну и ту же строку (начиная с самой последней для инкрементных резервных копий rsync с
--link-dest
):Или весь резервный каталог:
Любой файл в 'daily.1', ссылающийся на inode (он же "настоящий" файл), уже указанный в "daily.0", не будет засчитан.
Поэтому удаление daily.1 сэкономит 364 МБ на вашем устройстве.
УДАЛЯТЬ
источник