
我在一個檔案系統上有一組資料夾,這些資料夾已硬連結在一起(內容相同)。
當我將其中一個資料夾移到另一磁碟上的另一個檔案系統時會發生什麼?
我使用的是 Mac OSX 雪豹,並且使用命令列mv
命令。
答案1
不,預設mv
是這樣不是保留硬連結:
~$ 哪個MV /bin/mv 〜$ uname -a Darwin mini.local 13.4.0 Darwin 核心版本 13.4.0:2014 年 8 月 17 日星期日 19:50:11 PDT;根:xnu-2422.115.4~1/RELEASE_X86_64 x86_64 ~$ cd /卷/備份\ 主/ 備份主$ mkdir 測試 備份主$ cd test/ 測試 $ echo foo > a 測試$ ln ab 測試$ ls -li ab 14271856 -rw-r--r-- 2 位用戶員工 4 Oct 15 19:23 a 14271856 -rw-r--r-- 2 位用戶員工 4 Oct 15 19:23 b 測試 $ cd .. 備份主$ mv test ../備份\輔助/ 備份主要$ ls -li ../Backup\ secondary/test/ 總計 32 11040478 -rw-r--r-- 1 位用戶員工 4 Oct 15 19:23 a 11040479 -rw-r--r-- 1 位用戶員工 4 Oct 15 19:23 b
答案2
筆記
一個檔案系統上已硬連結在一起的資料夾
通常在 Unix 中不支援將目錄硬連結在一起。我假設您的意思是“一個目錄中的文件是到另一個目錄中的文件的硬連結”。
mv
行為
假設您有許多彼此硬連結的文件,即許多路徑通往在檔案系統中儲存過的相同資料。
比較這個 Unix & Linux SE 答案。相關部分:
檔案系統之間的移動(無論是否位於相同實體媒體上)都會處理為檔案副本,然後刪除。事實上,這正是該
mv
命令的作用。顯然,這意味著目標檔案系統必須建立檔案的新副本。
製作副本後,mv
與 類似地刪除來源rm
。這適用:
rm
只需刪除指針即可。如果您有多個指向該檔案的指標(硬連結),則刪除其中一個指標將使rm
其他指標完全保持不變,且資料仍然可用。
因此,如果您將一些硬連結檔案移至另一個檔案系統,其他硬連結是安全的。硬連結不能跨檔案系統,因此新副本不能是指向來源檔案系統上保留的任何內容的硬連結。
如果移動所有硬連結文件,它們將從來源文件系統中消失並出現在目標文件系統中。請注意,即使是單一文件mv
(移動多個文件)也會單獨建立每個新文件,它們會不再彼此硬連結。理論上mv
可以執行一些額外的工作來檢測硬連結並在目標檔案系統中重新創建它們,但事實並非如此(如這是另一個答案)。
移動硬鏈接以獲取硬鏈接
還有其他工具可以重新創建硬鏈接,tar
就是其中之一(儘管我無法確定tar
在 Mac OS X 上是否確實如此)。比較這:
預設情況下,如果您要求
tar
歸檔具有硬鏈接的文件,並且要歸檔的文件中包含多個此類鏈接,則它僅對該文件歸檔一次,並將第二個(以及任何其他名稱)記錄為硬連結。這意味著當您提取該存檔時,硬連結將被恢復。
請注意,硬連結將在恢復的檔案之間恢復(即它們將模仿來源的硬連結連接),但復原的檔案永遠不會重新硬連結到來源檔案(或其可能仍然存在的硬連結),即使它們是提取到與它們相同的檔案系統tar
。
tar
為了在不建立大型檔案的情況下利用它,您需要一些 shell 技巧。例如:
tar -c /source/dirA/ /source/file1 | { cd /foo/destination/ && tar -x; }
該命令執行複製而不刪除。如果您需要刪除來源,請最終使用單獨的命令來完成。