本文是筆者研究生期間在閱讀《Linux命令行與shell腳本編程大全》之後總結出來的一些重點知識的記錄,在此重新整理輸出。以便在給上個帖子 涉及到的相關知識點進行一下講解,幫助自己複習 shell腳本的首行規範化應該是 #!/bin/bash # function description 其中第一行 ...
在Linux文件系統中經常提及硬鏈接(Hard Link)和符號鏈接(Symbolic Link),Windows中也可以創建鏈接,但由於豐富的圖形界面操作,很少提及鏈接。Windows 的 NTFS 文件系統支持三種鏈接:硬鏈接(Hard Link)、符號鏈接(Symbolic Link)和目錄鏈接(junction point),此外還有一個大家非常熟悉鏈接機制:快捷方式。
創建鏈接
創建鏈接可以通過 dos 命令 mklink 或者 powershell 中的New-Item 創建。
mklink命令的使用說明如下圖所示。預設是創建文件符號鏈接,使用/D
參數則是創建目錄的符號鏈接,使用 /H
是創建硬鏈接,使用/J
是創建目錄聯結,也稱為軟鏈接(soft link)。
使用 powershell 創建鏈接的方式如下:
New-Item <鏈接路徑> -ItemType <鏈接類型> -Target <鏈接目標>
其中 ItemType 的取值可選:HardLink、SymbolicLink、Junction
幾種鏈接的區別
與 Linux 的文件系統中的 inode 與 block 類似,在 NTFS 文件系統中數據對象也賦予了獨一無二的文件 ID 以及與之對應的文件路徑,文件路徑和文件 ID 對應,文件 ID 和數據對象綁定,最終才呈現為可供用戶打開、編輯的文件。
快捷方式(shortcut)
快捷方式以.lnk
文件方式存在,文件大小僅有幾百位元組,與原始文件大小無關。適用於 Explorer 等應用程式,並非 NTFS 內置機制,從Win95開始得到支持。FAT32也支持。適用於文件、目錄,只能使用絕對路徑。可以跨盤符,可以跨主機,可以使用UNC路徑、網路驅動器。
符號鏈接
符號鏈接是將自己鏈接到一個目標文件或目錄的路徑上。當系統識別到符號鏈接時,它會跳轉到符號鏈接所指向的目標中去,而不改變此時的文件路徑。
符號鏈接從Vista開始得到支持,NTFS內置機制。適用於文件,目錄。可以理解為另一種形式的快捷方式(shortcut),文件大小為0位元組和不占用空間。可以使用相對/絕對路徑,可以跨盤符,跨主機,可以使用UNC路徑和網路驅動器。
硬鏈接
硬鏈接和符號鏈接的原理完全不同,符號鏈接是指向目標路徑的鏈接,而硬鏈接則是指向目標數據對象的鏈接。因為一個捲中的數據對象都有一個獨一無二文件 ID,也可以說硬鏈接是指向目標文件 ID 的鏈接。
硬鏈接從Windows NT4開始得到支持,是NTFS內置機制,FAT32不支持。只適用於文件,只能使用絕對路徑。本身無文件,不占用額外空間。hardlink與targetfile必須位於同一捲,可以簡單理解成不能跨盤符。
目錄聯接
目錄聯接從Windows2000/XP開始得到支持,是NTFS內置機制。只適用於目錄。只能使用絕對路徑。目錄鏈接通過重分析點實現,目錄鏈接可以跨捲,但是不能跨主機。
詳細對比
幾種鏈接方式詳細比較如下表所示
shortcut | hard link | junction point | symbolic link | |
---|---|---|---|---|
創建方式 | 右鍵 -> 創建快捷方式 | mklink /H Link Target | mklink /J Link Target | mklink /D Link Target |
存在方式 | 以.lnk文件方式存在,適用於Explorer等應用程式。非NTFS內置機制,從Win95開始得到支持。FAT32支持。 | NTFS內置機制,從Windows NT4開始得到支持。FAT32不支持。 | NTFS內置機制,從Windows2000/XP開始得到支持。是 NTFS 3.0 及以上文件系統(Windows 2000 及以上系統)的特性,它是鏈接本地目錄(可跨捲)的訪問點,通過交接點的操作都會被系統映射到實際的目錄上。通過建立交接點,可以在保證一個目錄實例(目錄的一致性)的前提下,允許用戶或程式從本地文件系統中的多個位置訪問此目錄。 | NTFS內置機制,從Vista開始得到支持。文件類型是.SYMLINK |
適用範圍 | 同時適用於文件、目錄,只能使用絕對路徑。 | 只適用於文件,只能使用絕對路徑。 | 只適用於目錄。只能使用絕對路徑。即使創建junction point時使用了相對路徑,保存到NTFS中時將隱式轉換成絕對路徑。 | 同時適用於文件、目錄。這是一種超級shortcut,文件大小為0位元組和不占用空間。 |
使用限制 | 可以跨盤符,可以跨主機,可以使用UNC路徑、網路驅動器。 | hard link與targetfile必須位於同一volume,可以簡單理解成不能跨盤符。 | junction point必須與target directory位於同一local computer,可以簡單理解成不能跨主機, 在local computer範圍內,可以跨盤符。不能使用UNC路徑;假設Z是通過網路映射生成的盤符,同樣不適用於Z。 | 可以使用相對、絕對路徑。假設創建symbolic link時使用了相對路徑,保存到NTFS中的就是相對路徑,不會隱式轉換成絕對路徑。可以跨盤符,可以跨主機,可以使用UNC路徑、網路驅動器。 |
移動能力 | 本身有文件,可以複製,移動等操作。 | / | / | / |
文件 | 文件大小僅有幾百位元組, 跟原文件大小無關,文件類型是.lnk。 | 本身無文件,為文件創建多入口。由於不同的文件指向的是同樣的數據,所以無論給同一個文件創建多少個硬鏈接,他們占整個捲的數據大小都是一樣的。 | 對交接點內文件和子目錄的“建立、刪除、修改”等操作都被映射到對應的目錄中的文件和子目錄上,對交接點的“複製、粘貼、剪切、配置 ACL”,只會影響此交接點,在同一捲內移動交接點,只會影響此交接點,但在不同捲間移動交接點,會將此交接點轉換為正常目錄,並且交接點對應目錄下的所有內容都會被移動。 | 符號鏈接(Symlink,Softlink)是對文件或目錄的引用,實際上符號鏈接本身是一個“記錄著所引用文件或目錄的絕對或相對路徑”的特殊文件,通過符號鏈接的操作都會被重定向到目標文件或目錄。對符號鏈接和快捷方式的“讀、寫、遍歷”等操作都會被重定向到目標文件或目錄,但對它們的“複製、刪除、移動、配置 ACL”等操作只針對自身。 |
關聯 | 刪除shortcut,不影響target。 | 在Explorer中刪除hard link,不影響targetfile。刪除target file,不影響hardlink。事實上由於hard link的語義,此時剩下的hardlink就是原始數據的唯一訪問點。只有當一個文件 ID 對應的所有硬鏈接被刪除時,數據才真正被標記為刪除。 | 刪除target directory,junction point仍將存在,但失效了,變得不可用。這個很好理解,因為此時junction point指向不存在的目錄。 | 在Explorer中刪除symboliclink,不影響target。刪除target,symboliclink仍將存在,但失效了,變得不可用。它們可以像普通文件一樣操作,但所有對符號鏈接的操作都實際作用於目標對象。符號鏈接對用戶而言是透明的,符號鏈接看上去和普通的文件和文件夾沒有區別,操作方法也一模一樣(更類似於 Linux 的軟鏈接)。 |
鏈接的應用
- 硬鏈接:可以在不複製文件的情況下,實現文件的快速訪問以及文件的備份,還可以防止重要文件誤刪,因為刪除的是文件的鏈接,而非文件數據本身。
- 符號鏈接:可以把一個路徑映射到另一個路徑,或者指向遠程文件或目錄,甚至可以通過網路連接到其他電腦上的文件。
- 目錄聯接:實現路徑重定向,當訪問鏈接目錄時,系統會自動重定向到實際目錄,例如:Vista的"C:\Documents and Settings"是指向"C:\Users"的junctionpoint,這樣一些使用了硬編碼"C:\Documents and Settings"的老程式可以在Vista上正常工作。此外,還可以解決Windows文件路徑長度限制帶來的問題(從 Windows 10 版本 1607 開始,可以通過設置註冊表以及應用程式清單啟用長路徑)。
參考
- https://learn.microsoft.com/zh-cn/windows/win32/fileio/hard-links-and-junctions
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-item?view=powershell-7.4
- https://learn.microsoft.com/zh-cn/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-version-1607-and-later