取消引用硬鏈接

取消引用硬鏈接

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

據我所知,運行tarwith--hard-dereference意味著您不會獲得具有兩個不同文件名的單個文件(如上例所示),而是會獲得兩個文件,每個文件都有一個文件名。 tar可能會檢查每個檔案上的連結計數,預設情況下,在提取時,它會在第二個檔案名稱上為硬連結檔案資料建立硬連結。當在存檔創建時調用時--hard-dereference,它似乎在運行提取調用時為第二個文件名創建一個全新的文件tar

相關內容