zoukankan      html  css  js  c++  java
  • windows7中的“mklink命令” 转

     

     

      从 Vista 以后,微软将用户文件和用户的软件配置( AppData ) 明确划分开,并且全部存放在使用者的用户目录下。

      Linux早已这样做了,并且在Linux中可将 home 挂载为独立分区,而微软显然还没学到家。用户目录依旧和系统目录一起放在同一分区。

      如何将用户目录移动到非系统分区?这是本文的出发点。但本文的重心不在于此,而是 mklink ,一个命令。

    一、何为 mklink
      mklink 是何方神圣,值得专门作文讲述?

      如果用过 Linux ,那想必也看到过符号链接(这是一种特殊的文件),也用过 “ ln ” 这个链接命令,mklink 和 ln 的功能几乎一样。

      mklink 便是用来创建符号链接的,这个命令并不知名,使用的人也不多。

    自从 Vista 以后,微软便在 widows中 偷偷地用起了这个工具 。在用户目录下,可以看到很多很像快捷方式的文件,当然这是隐藏的,但却不能打开,其实这便是符号链接。

    >dir C:Userswclu /a
    驱动器 C 中的卷是 win7
    卷的序列号是 8CD0-A743

    1. C:Userswclu 的目录  
    2.   
    3. 2009/06/11 11:42    <DIR>          .  
    4. 2009/06/11 11:42    <DIR>          ..  
    5. 2009/06/11 00:04    <DIR>          AppData  
    6. 2009/06/11 00:04    <JUNCTION>     Application Data [C:UserswcluAppDataRoaming]  
    7. 2009/06/11 00:04    <DIR>          Contacts  
    8. 2009/06/11 00:04    <JUNCTION>     Cookies [C:UserswcluAppDataRoamingMicrosoftWindowsCookies]  
    9. 2009/06/11 10:05    <DIR>          Desktop  
    10. 2009/06/11 00:04    <DIR>          Documents  
    11. 2009/06/11 02:44    <DIR>          Downloads  
    12. 2009/06/11 00:04    <DIR>          Favorites  
    13. 2009/06/11 00:04    <DIR>          Links  
    14. 2009/06/11 00:04    <JUNCTION>     Local Settings [C:UserswcluAppDataLocal]  
    15. 2009/06/11 00:04    <DIR>          Music  
    16. 2009/06/11 00:04    <JUNCTION>     My Documents [C:UserswcluDocuments]  


     

    上述标红色的文件,便是符号链接了(上述文件并非C:Userswclu目录下全部文件) 。

    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:a1.txt拒绝访问。

    E:>mklink c:2.txt c:a1.txt
    为 c:2.txt <<===>> c:a1.txt 创建的符号链接

    可见为文件创建链接时,符号链接文件的扩展名要和原文件保持一致。

    E:>mklink c:a1.txt d:3.txt
    当文件已存在时,无法创建该文件。

    E:>mklink d:3.txt c:a1.txt
    为 d:3.txt <<===>> c:a1.txt 创建的符号链接

    可见为文件创建链接时,必须是 “mklink 符号链接文件名   原文件名”的格式。

    创建目录链接
    E:>mklink /d c: d:a
    为 c: <<===>> d:a 创建的符号链接

    虽然d:a 目录不存在,但依然可以创建链接,很好很强大。但打开链接时,提示错误。

    E:>mklink /d d:a c:a
    为 d:a <<===>> c:a 创建的符号链接

    E:>dir d: /a
    驱动器 D 中的卷是 soft
    卷的序列号是 BE86-8884

    D: 的目录

    1. 2009/06/11 10:00    <DIR>          $RECYCLE.BIN  
    2. 2009/06/11 13:08    <SYMLINK>      3.txt [c:a1.txt]  
    3. 2009/06/11 13:18    <SYMLINKD>     a [c:a]  
    4. 2009/06/11 12:54    <DIR>          Program Files  
    5. 2009/06/11 09:58    <DIR>          System Volume Information  
    6. 1 个文件              0 字节  
    7. 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: c:a
    为 d: <<===>> c:a 创建的符号链接

    下面显示D分区中的文件及目录列表:

    E:>dir d: /a
    驱动器 D 中的卷是 soft
    卷的序列号是 BE86-8884

    D: 的目录

    1. 2009/06/11 10:00    <DIR>          $RECYCLE.BIN  
    2. 2009/06/11 13:33    <SYMLINK>      1.txt [c:a1.txt]  
    3. 2009/06/11 13:34    <JUNCTION>     a [c:a]  
    4. 2009/06/11 13:35    <SYMLINKD>     b [c:a]  
    5. 2009/06/11 12:54    <DIR>          Program Files  
    6. 2009/06/11 09:58    <DIR>          System Volume Information  
    7. 1 个文件              0 字节  
    8. 5 个目录 31,089,442,816 可用字节  

    mklink 不加参数或加参数 /d 时,创建的链接文件为<SYMLINK>型(<SYMLINKD>代表链接到目录)。

    当加参数 /j 时,只能为目录创建联接,并且创建的联接文件为<JUNCTION>型,两种类型的链接文件有显著区别:

     

    从最开始的 “ >dir C:Userswclu /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: 为<SYMLINKD>型符号链接 */
    E:>xcopy d: e: /B
    目标 E: 是文件名
    还是目录名
    (F = 文件,D = 目录)? D
    复制了 0 个文件

    E:>dir e: /a
    驱动器 E 中的卷是 data
    卷的序列号是 FEEE-FB51

    E: 的目录

    1. 2009/06/11 10:00    <DIR>          $RECYCLE.BIN  
    2. 2009/06/11 13:33    <SYMLINK>      1.txt [c:a1.txt]  
    3. 2009/06/11 13:34    <DIR>          a  
    4. 2009/06/11 13:35    <SYMLINKD>     b [c:a]  
    5. 2009/06/11 09:58    <DIR>          System Volume Information  
    6. 1 个文件              0 字节  
    7. 4 个目录 31,362,203,648 可用字节  

    可见采用xcopy命令并上参数 /B ,可以成功复制 <SYMLINK> 型的符号链接文件,而<JUNCTION>型链接却不能被复制。

    符号链接文件的透明性
    符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。
    普通的文件操作命令(如cp、rm等)都能直接作用于符号链接。用于读写文件内容的命令将会直接访问目标文件。

  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/3604926.html
Copyright © 2011-2022 走看看