Windows下的符號連結

來源:互聯網
上載者:User

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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.