換了新本本之後,不安於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等)都能直接作用於符號連結。用於讀寫檔案內容的命令將會直接存取目標檔案。