Как определить, какую жесткую ссылку игнорировать?

5116
Belmin Fernandez

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

$ 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?

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

5

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

11
roguesys

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

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

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

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

Понимаю. Таким образом, он перемещается по каталогам в алфавитном порядке и отслеживает видимые иноды. По крайней мере, на этом заканчиваются дальнейшие испытания на моей стороне. Belmin Fernandez 13 лет назад 1
Я полагаю, что du только просматривает каталоги в алфавитном порядке в описанных выше случаях, потому что именно так глобус расширяет подстановочный знак *. Я могу ошибаться, но не рекомендую рассчитывать на алфавитный порядок. Slartibartfast 13 лет назад 5
@Slartibartfast вы правы, запускаете `ls | сортировать -r | xargs du -hs` показывает последнюю папку как 500 K. Таким образом, она отслеживает иноды в том порядке, в котором они их видят, будь то алфавитный или другой. roguesys 13 лет назад 2
4
SilverWave

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

du -sh jeter jeter mariano 

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

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

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

Хотя это и странно, но это согласуется с первой цитатой POSIX Денниса Уильямсона, в которой говорится, что индекс запоминается только для «файлов с несколькими ссылками», подразумевая, что файлы, имеющие только одну (жесткую) ссылку, будут учитываться при каждом включении каталога, в то время как те, у кого несколько ссылок, будут учитываться только в первый раз. +1 за нахождение интересного крайнего случая. Dave Sherohman 13 лет назад 0
3
Dennis Williamson

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

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

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

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

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

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

du -sh jeter mariano du -sh mariano jeter 
Когда `du -sh` выполняется без глобализации, пользователь (вызывающая сторона) определит порядок, в котором он предоставил аргументы. (например, `jeter mariano` или` mariano jeter`) Когда это сделано * с * глобализацией, порядок по-прежнему не решается самим `du`, он определяется оболочкой, согласно вашему второму процитированному отрывку POSIX. Dave Sherohman 13 лет назад 1
1
Udo Kaune

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

Это не ответ на этот вопрос. И `ls -c` сортирует по _inode change time_, а не _create time_ (который обычно не сохраняется). Scott 9 лет назад 0

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