本文自http://www.cnblogs.com/rangeon/archive/2010/08/24/1807087.html轉貼

Windows下的符號連結
換了新本本之後,不安於Windows Server 2003 R2了,之前也嘗試過Windows Vista / Windows 7 / Windows Server 2008,但最後都由於各種不爽的原因而放棄,主要還是電腦配置太差,這次終於有機會升級系統了,於是裝了Windows Server 2008 R2,用了兩個月感覺還不錯,各方面表現還算湊和,基本上還算爽。

發現2008R2的使用者目錄結構有了點變化(Win7好像也相同),不再是以前那種 SYS:\Documents and Settings\xxx 了,改成了 SYS:\Users\xxx,即使是使用dir /a查看,有個隱藏的Documents and Settings也是指向[SYS:\Users]的JUNCTION。而且SYS:\User\xxx\之下的目錄結構也有了大變化,之前Windows版本中的很多目錄都被移到了SYS:\User\xxx\AppData之下,SYS:\User\xxx\之下的目錄大都是一些使用者檔存放的目錄,以前都在“我的文件”中,現在都被放到了使用者目錄中,一大堆“我的xx”目錄。

這樣問題就來了,以前我都是直接把“我的文件”通過“移動”操作挪到D:盤,現在要挪一大堆目錄,而且有的還不能挪動。Google之,找到很多相關文章,修改註冊表的方法本人不太喜歡,相比之下覺得這個老外的“How to Move your Windows User Profile to another Drive” 寫的很不錯,很好很強大!原來NTFS早就支持JUNCTION了,只是我一直不知道,寒自己一個!也可能是本人使用Linux的緣故吧,對使用符號連結尤為鍾情。很輕鬆的就把我的使用者目錄挪到了D:盤,mklink還真是很強大。這幾天又把我的OpenSSHServer的git庫目錄挪到了我的Workspace目錄,OpenSSHServer裡只放了一個JUNCTION,然後又把經常和移動硬碟同步的幾個目錄都mklink到一個目錄裡,這樣以後就只要同步一個目錄就OK了,實在是太方便了!

今天心血來潮突然想試試mklink在XP下的表現,反正是NTFS都是支持JUNCTION的。在2008R2的整個系統磁片中搜索mklink.exe居然沒搜到,Google一下才知道,原來mklink是一個DOS的內部命令!暈了,再Google“mklink XP”,搜到兩個工具junction.exe和linkd.exe,都可以實現目錄的JUNCTION,果然很好用!可惜自己卻一直都不知道,在這一點上看來是本人對Windows有偏見了,總覺得它太差。

關於目錄聯接<JUNCTION>和目錄符號連結<SYMLINKD>之本人體會:
mklink /j 創建目錄聯接<JUNCTION>,類似於硬連結,但又不是硬連結,它使用絕對路徑,創建的連結可移動到任意位置使用;
mklink /d 創建目錄符號連結<SYMLINKD>,它可以使用相對路徑,使用相對路徑創建的連結,移動位置後不能工作。
另,mklink /j 只用於創建目錄聯接<JUNCTION>,而符號連結可以創建檔的或目錄的均可。

最後,轉載一些關於mklink的文字,由於已經搞不清最終的原作者了,在此原作者表示無上的敬意!

---------------------------------------------- 無敵分割線 ---------------------------------------------------------

一、何為 mklink

mklink 是何方神聖,值得專門作文講述?
如果用過 Linux ,那想必也看到過符號連結(這是一種特殊的檔),也用過 “ ln ” 這個連結命令,mklink 和 ln 的功能幾乎一樣。
mklink 便是用來創建符號連結的,這個命令並不知名,使用的人也不多。

自從 Vista 以後,微軟便在 widows中 偷偷地用起了這個工具 。在使用者目錄下,可以看到很多很像快捷方式的檔,當然這是隱藏的,但卻不能打開,其實這便是符號連結。

>dir C:\Users\wclu /a
驅動器 C 中的卷是 win7
卷的序號是 8CD0-A743

C:\Users\wclu 的目錄

2009/06/11 11:42 <DIR> .
2009/06/11 11:42 <DIR> ..
2009/06/11 00:04 <DIR> AppData
2009/06/11 00:04 <JUNCTION> Application Data [C:\Users\wclu\AppData\Roaming]
2009/06/11 00:04 <DIR> Contacts
2009/06/11 00:04 <JUNCTION> Cookies [C:\Users\wclu\AppData\Roaming\Microsoft\Windows\Cookies]
2009/06/11 10:05 <DIR> Desktop
2009/06/11 00:04 <DIR> Documents
2009/06/11 02:44 <DIR> Downloads
2009/06/11 00:04 <DIR> Favorites
2009/06/11 00:04 <DIR> Links
2009/06/11 00:04 <JUNCTION> Local Settings [C:\Users\wclu\AppData\Local]
2009/06/11 00:04 <DIR> Music
2009/06/11 00:04 <JUNCTION> My Documents [C:\Users\wclu\Documents]

上述標紅色的檔,便是符號連結了(上述檔並非C:\Users\wclu目錄下全部檔) 。

Vista/Windows 7使用這些符號連結,是為了相容XP等系統。

二、mklink 用法

mklink 只能在命令提示符 “CMD” 中使用。

>mklink /?
創建符號連結。

MKLINK [[/D] | [/H] | [/J]] Link Target

/D 創建目錄符號連結。黙認為檔
符號連結。
/H 創建硬連結,而不是符號連結。
/J 創建目錄聯接。
Link 指定新的符號連結名稱。
Target 指定新連結引用的路徑
(相對或絕對)。

注:上述的符號連結等同於Linux中的軟連結。

為了試驗 mklink 的功能,我在 C分區中創建目錄 a ,並在目錄中存放檔 1.txt。

創建檔連結
E:\>mklink c:\1 c:\a\1.txt拒絕訪問。

E:\>mklink c:\2.txt c:\a\1.txt
為 c:\2.txt <<===>> c:\a\1.txt 創建的符號連結

可見為檔創建連結時,符號連結檔的副檔名要和原文件保持一致。

E:\>mklink c:\a\1.txt d:\3.txt
當文件已存在時,無法創建該文件。

E:\>mklink d:\3.txt c:\a\1.txt
為 d:\3.txt <<===>> c:\a\1.txt 創建的符號連結

可見為檔創建連結時,必須是 “mklink 符號連結檔案名 原檔案名”的格式。

創建目錄連結
E:\>mklink /d c:\b d:\a
為 c:\b <<===>> d:\a 創建的符號連結

雖然d:\a 目錄不存在,但依然可以創建連結,很好很強大。但打開連結時,提示錯誤。

E:\>mklink /d d:\a c:\a
為 d:\a <<===>> c:\a 創建的符號連結

E:\>dir d: /a
驅動器 D 中的卷是 soft
卷的序號是 BE86-8884

D:\ 的目錄

2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:08 <SYMLINK> 3.txt [c:\a\1.txt]
2009/06/11 13:18 <SYMLINKD> a [c:\a]
2009/06/11 12:54 <DIR> Program Files
2009/06/11 09:58 <DIR> System Volume Information
1 個檔 0 位元組
4 個目錄 31,089,442,816 可用位元組

當把D分區中的連結檔刪除時,C分區中的檔和資料夾不受任何影響。

三、mklink /d 與 makelink /j 的異同

從 mklink 的幫助中可以看到,兩者皆可以創建目錄連結。

細心的同學可以發現,前者是創建目錄連結,而後者是創建目錄聯接。

一字之差,有何分別?

下面分別用這兩種方式為同一目錄創建連結:

E:\>mklink /j d:\a c:\a
為 d:\a <<===>> c:\a 創建的聯接

E:\>mklink /d d:\b c:\a
為 d:\b <<===>> c:\a 創建的符號連結

下面顯示D分區中的檔及目錄清單:

E:\>dir d: /a
驅動器 D 中的卷是 soft
卷的序號是 BE86-8884

D:\ 的目錄

2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:33 <SYMLINK> 1.txt [c:\a\1.txt]
2009/06/11 13:34 <JUNCTION> a [c:\a]
2009/06/11 13:35 <SYMLINKD> b [c:\a]
2009/06/11 12:54 <DIR> Program Files
2009/06/11 09:58 <DIR> System Volume Information
1 個檔 0 位元組
5 個目錄 31,089,442,816 可用位元組

mklink 不加參數或加參數 /d 時,創建的連結檔為<SYMLINK>型(<SYMLINKD>代表連結到目錄)。

當加參數 /j 時,只能為目錄創建聯接,並且創建的聯接檔為<JUNCTION>型,兩種類型的連結檔有顯著區別:

從最開始的 “ >dir C:\Users\wclu /a ” 可以看出,微軟自家使用的都是<JUNCTION>型,至於為何,留待考證。

四、連結檔的特性

剛剛講述了如何用 mklink 創建連結檔,那麼接下來重點講述如何連結檔的特性,既然是特性,那就是與眾不同了。

符號連結檔自身不能被 “複製”(只能通過特殊方法才能複製)
當複製符號連結檔時,會將符號連結所連結的目的檔案或目錄進行複製,並非是複製符號連結檔本身。
如何實現符號連結檔的複製呢?
>copy /?
/L 如果源是符號連結,請將連結複製
到目標而不是源連結指向的實際檔。

>xcopy /? /B 對照連結目標複製符號連結本身

/* d:\1.txt 為<SYMLINK>型符號連結 */
E:\>xcopy d:\1.txt e:\1.txt /b
目標 E:\1.txt 是檔案名
還是目錄名
(F = 檔,D = 目錄)? F
D:\1.txt
複製了 1 個檔

/* d:\a 為<JUNCTION>型符號連結 */
E:\>xcopy d:\a e:\a /B
目標 E:\a 是檔案名
還是目錄名
(F = 檔,D = 目錄)? D
複製了 0 個檔

/* d:\b 為<SYMLINKD>型符號連結 */
E:\>xcopy d:\b e:\b /B
目標 E:\b 是檔案名
還是目錄名
(F = 檔,D = 目錄)? D
複製了 0 個檔

E:\>dir e: /a
驅動器 E 中的卷是 data
卷的序號是 FEEE-FB51

E:\ 的目錄

2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:33 <SYMLINK> 1.txt [c:\a\1.txt]
2009/06/11 13:34 <DIR> a
2009/06/11 13:35 <SYMLINKD> b [c:\a]
2009/06/11 09:58 <DIR> System Volume Information
1 個檔 0 位元組
4 個目錄 31,362,203,648 可用位元組

可見採用xcopy命令並上參數 /B ,可以成功複製 <SYMLINK> 型的符號連結檔,而<JUNCTION>型連結卻不能被複製。

符號連結檔的透明性
符號連結的操作是透明的:對符號連結檔進行讀寫的程式會表現得直接對目的檔案進行操作。
普通的檔操作命令(如cp、rm等)都能直接作用於符號連結。用於讀寫檔內容的命令將會直接訪問目的檔案。

 

 

arrow
arrow
    文章標籤
    windows ln mklink
    全站熱搜

    痞客興 發表在 痞客邦 留言(0) 人氣()