在命令的手冊頁中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
。