Как `du` только пространство, израсходованное файлами, которые не привязаны в другом месте?

Используя rsync --link-dest для компактных снимков , как я могу определить, сколько места я фактически сохранил? Или более общий:

Как определить, сколько места используется в каталоге, рассматривая только файлы, которые не имеют жесткой привязки в другом месте за пределами структуры каталогов? Напрашивается по-другому: сколько свободного места будет освобождено после удаления этого каталога? ( du -hs будет лежать. Возможно, потребуется место, необходимое для самих жестких ссылок)

  • Нет свободного места на устройстве / Нет Inodes бесплатно ИЛИ используется / Двойной монтаж
  • команда du показывает разные результаты, чем st_blocks
  • Как определить, будет ли запущенный tar вызвать диск для заполнения
  • df -h показывает только половину дискового пространства, которое, как я думал, у меня было?
  • Несоответствие между выводами `fsck` и` df`
  • Как найти пакеты Debian, которые освободят пространство
  • Повторные файловые системы и точки монтирования в выводе df
  • Как получить общий размер всего в каталоге в одной строке?
  • 3 Solutions collect form web for “Как `du` только пространство, израсходованное файлами, которые не привязаны в другом месте?”

    Предполагая, что нет внутренних жестких ссылок (т. Е. Каждый файл с более чем одной жесткой линией связан из-за дерева), вы можете:

     find . -links -2 -print0 | du -c --files0-from=- 

    EDIT И вот что я набросал в комментарии, применен. Только без du ; kudos @StephaneChazelas для заметок du не требуется. Объяснение в конце.

     ( find . -type d -printf '%k + ' ; \ find . \! -type d -printf '%n\t%i\t%k\n' | \ sort | uniq -c | \ awk '$1 >= $2 { print $4 " +\\" }' ; \ echo 0 ) | bc 

    Мы делаем это, чтобы создать строку с использованием диска (в КБ) каждого соответствующего файла, разделенного знаками плюс. Затем мы кормим это большое дополнение к bc .

    Первый вызов find делает это для каталогов.

    Второй find печатает количество ссылок, индекс и использование диска. Мы передаем этот список через sort | uniq -c sort | uniq -c чтобы получить список (количество появлений в дереве, количество ссылок, индекс, использование диска).

    Мы передаем этот список через awk , и если первое поле (# появления) больше или равно второй (# жестких ссылок), то есть нет ссылок на этот файл вне дерева, а затем напечатайте четвертое поле (использование диска) со знаком плюс и обратная косая черта.

    Наконец, мы выводим 0 , поэтому формула является синтаксически правильной (она вписывается в + противном случае) и передает ее на bc . Уф.

    (Но я бы использовал более простой первый метод, если он дает достаточно хороший ответ.)

    В принципе, вам нужно получить номера inode и количество ссылок для всех файлов (не-каталогов), сравнить это количество ссылок с количеством вхождений каждого индексного дескриптора, а если они отличаются, исключите файл.

    Предполагая, что они все в одной файловой системе, что-то вроде этого должно работать (с GNU find):

     find . -type d -printf '%k\n' -o -printf '%i %n %k\n' | awk ' NF==1{t+=$0; next} {n1[$1]=$2; n2[$1]++; s[$1]=$3} END { for (i in n1) if (n1[i] == n2[i]) t+=s[i] print t }' 

    du actualy не будет лгать;) Он анализирует режиссер (ы), который он дает, считая только первые жесткие ссылки, указывающие на тот же inode, с которым он сталкивается.

    Если вы спросите, что он видит только в одном каталоге, все равно, что есть другие жесткие ссылки, указывающие на одно и то же содержимое:

     $ du -h daily.0 && du -hc daily.1 29G /daily.0 29G /daily.1 

    Теперь дайте ему dirs в той же строке (начиная с самой последней для инкрементных резервных копий rsync с --link-dest ):

     $ du -hc daily.0 daily.1 29G /daily.0 364M /daily.1 29G total 

    Или весь резервный каталог:

     $ du -hc --max-depth=1 /snapshots 29G /daily.0 364M /daily.1 537M /daily.2 333M /daily.3 30G total 

    Любой файл в 'daily.1', ссылающийся на inode (иначе называемый «реальный» файл), уже упоминаемый в «daily.0», не будет считаться.

    Поэтому удаление ежедневно.1 будет сохранять 364 МБ на вашем устройстве.

    УДАЛИТЬ

    Linux и Unix - лучшая ОС в мире.