在命令的手册页中tar
,列出了跟踪硬链接的选项。
-h, --dereference
follow symlinks; archive and dump the files they point to
--hard-dereference
follow hard links; archive and dump the files they refer to
如何tar
知道文件是硬链接?怎么做的跟随它?
如果我不选择此选项怎么办?怎么做的不是硬取消引用?
答案1
默认情况下,如果您要求tar
归档带有硬链接的文件,并且要归档的文件中包含多个此类链接,则它仅对该文件归档一次,并将第二个(以及任何其他名称)记录为硬链接。这意味着当您提取该存档时,硬链接将被恢复。
如果您使用该--hard-dereference
选项,tar
那么不是保留硬链接。相反,它将它们视为恰好具有相同内容和元数据的独立文件。当您提取存档时,文件将是独立的。
注意:它通过首先检查文件的链接计数来识别硬链接。它记录具有多个链接的每个文件的设备号和索引节点,并使用它来检测同一文件何时再次归档。 (当您使用 时--hard-dereference
,它不会执行此操作。)
答案2
您可以使用“链接计数”区分具有硬链接的文件和非硬链接的文件。我看到有两种从命令行获取此信息的方法:
% 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
“bediger”之前那个孤独的“2”是链接计数。请注意,两个文件名具有相同的索引节点号 932815。
我确信这两个命令都从 struct stat 的 st_nlink 字段中获取链接计数,该字段由系统调用填充stat()
。
据我所知,运行tar
with--hard-dereference
意味着您不会获得具有两个不同文件名的单个文件(如上例所示),而是会获得两个文件,每个文件都有一个文件名。 tar
可能会检查每个文件上的链接计数,默认情况下,在提取时,它会在第二个文件名上为硬链接文件数据创建硬链接。当在存档创建时调用时--hard-dereference
,它似乎在运行提取调用时为第二个文件名创建一个全新的文件tar
。