Вы можете отличить файл с жесткими ссылками на него от файла, не связанного с жесткой связью, с помощью «количества ссылок». Я вижу два способа получить это из командной строки:
% stat original
File: ‘original’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 804h/2052d Inode: 932815 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 500/ bediger) Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
Birth: -
Или
1010 % ls -li
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary
Одинокое «2» перед «bediger» - это количество ссылок. Обратите внимание, что оба имени файла имеют одинаковый номер инода 932815.
Я уверен, что обе эти команды получают счетчик ссылок из поля st_nlink структуры stat, которое заполняется stat()
системным вызовом.
Насколько я могу судить, запуск tar
с --hard-dereference
означает, что вместо получения одного файла с двумя разными именами файлов (как в примере выше), вы получите два файла, каждый с одним именем файла. tar
вероятно, проверяет счетчик ссылок для каждого файла, и по умолчанию при извлечении он создает жесткую ссылку на второе имя файла, которое имеет для данных файла с жесткой привязкой. Когда вызывается при --hard-dereference
создании архива, создается впечатление, что он создает совершенно новый файл для второго имени файла при вызове извлечения tar
прогонов.