5

У нас есть два каталога:

$ ls -l
total 8
drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 jeter
drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 mariano

Я создаю один файл в первой папке:

$ dd if=/dev/zero of=jeter/zero_file.1 bs=512000 count=1
1+0 records in
1+0 records out
512000 bytes (512 kB) copied, 0.268523 s, 1.9 MB/s

Это вывод du:

$ du -sh *
504K    jeter
4.0K    mariano

Как и следовало ожидать, если я размещу жесткую ссылку на zero_file. в другой папке du вывод не меняется:

$ ln jeter/zero_file.1 mariano/zero_file.2
$ du -sh *
504K    jeter
4.0K    mariano

Однако, насколько мне известно, в файловой системе нет ничего, что указывало бы на zero_file.1 в качестве исходного файла. Так как же du знать , чтобы рассчитывать zero_file.1 но не zero_file.2

Это не может быть сравнение с отметкой времени, потому что все жесткие ссылки имеют один индекс; у них будут одинаковые метки времени?

4 ответа4

11

Расширение вашего теста на три папки, вы можете увидеть , что только в первый раз инод хит - du подсчитывать делает это. Если вы зайдете в отдельную папку и запустите du , вы получите полный размер.

Тестировать:

mkdir alexandru
ln mariano/zero_file.2 alexandru/zero_file.0
du -sh *

Теперь вы должны увидеть, как alexandru берет 500K+. Поэтому, не глядя на код du , я предполагаю, что он хранит список пройденных инодов и не пересматривает уже увиденные.

4

Если вы делаете

du -sh jeter jeter mariano

Тогда вы получите 2 разных размера для джитера.

Похоже, что это соответствует выводу выше ...

... кроме того, не должно ли 1-е значение быть суммой, а 2-е - нулем?

3

По-видимому, когда fstat(3) видит, что количество жестких ссылок больше единицы, он записывает номер инода для последующего сопоставления. Согласно POSIX:

Файлы с несколькими ссылками должны учитываться и записываться только для одной записи. Запись каталога, выбранная в отчете, не указана.

Оболочка расширяет глобус * в лексическом порядке, согласно POSIX:

Если шаблон соответствует каким-либо существующим именам файлов или путям, шаблон должен быть заменен этими именами файлов и путями, отсортированными в соответствии с последовательностью сортировки, действующей в текущей локали.

Однако, когда du -sh выполняется без сбоев, порядок должен быть определен каким-то образом, но, похоже, он должен зависеть от реализации.

Обратите внимание, что эти две команды дают разные результаты:

du -sh jeter mariano
du -sh mariano jeter
1

Если вы хотите проверить, работает ли ваша резервная копия с машины времени rsync, и, возможно, более важно, сколько места для резервного копирования вы экономите, вы должны выполнить ls -cr | xargs du -hs который будет направлять каталоги в du в правильной последовательности (обратное время создания).

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