![]() |
![]() |
#1 (permalink) |
版主
注册日期: 2012-02-07
帖子: 281
|
![]()
============首先先白活一下儿有可能是众所周知的概念,各位可以忽略此段直接到下一个无敌的分割线============
之前在使用linux系统时,经常会用到创建链接的操作,所谓链接,就是创建一个符号,将这个符号指向一个文件或者目录, 个人理解,也可以说是这个符号是指向文件或者目录的一个指针。 软链接也叫符号链接,关于这两种链接的区别,将在最后说明。 我在linux经常使用软链接,主要用途下面举个例子: 比如在编译apache之后,会产生如下目录,/usr/local/apache2.0/ 这时的启动apache的命令就是: /usr/local/apache2.0/bin/apachectl start 接下来,我要将apache2.0升级到apache2.2, 那么我的启动apache2.2的命令就是: /usr/local/apache2.2/bin/apachectl start 现在,我要将系统中所有用到/usr/local/apache2.0/bin/apachectl start的地方(例如启动脚本,crontab等) 都换成/usr/local/apache2.2/bin/apachectl start 很累,万一想从2.2版本,切换回2.0版本,还要再都改一遍。 我的方法是创建一个软链接,在最开始编译好apache2.0时,创建软链接命令如下: ln -s /usr/local/apache2.0/ /usr/local/apache2 这样,apache2就是apache2.0的一个软链接了, 现在,我的/usr/local/目录下除了apache2.0还有了apache2.2, 那么我只要取消原来的apache2软链接: unlink /usr/local/apache2 【这里需要特别注意的是,apache2最后不要加”/”】 再重新创建软链接: ln -s /usr/local/apache2.2/ /usr/local/apache2 这样,我其他地方启动apache的脚本统一写成: /usr/local/apache2/bin/apachectl start 通过切换软链接的方式,来启动不同版本的apache,方便又省事儿,而且,如果从2.0切换至2.2之后,发现有问题,还可以通过这种方式快速的切换回2.0版本。 好了,贫了这么半天,来说说windows下如何创建链接吧, 今天发现电脑的E盘只剩下200多M了,一看自己的eclipse的workspace占用了6个多G,于是乎,有了转移workspace目录的想法,C盘还有10多个G,就放在C盘吧。 ============windows自带的命令行下如何创建硬链接============ 先来一句话说明windows创建硬链接的方法: 命令行中执行: fsutil hardlink create <新文件名> <现有文件名> 例如: fsutil hardlink create e:\target.txt e:\source.txt 则在E盘根目录创建了名为”target.txt”的,指向E盘根目录的source.txt的硬链接,需要说明的是: 硬链接文件有两个限制(Unix/Linux 和 Windows 也都如此) (1) 不允许给目录创建硬链接; (2) 只有在同一文件系统中的文件之间才能创建链接。 在windows下,创建硬链接还必须是在同一个卷(分区)下。 很显然,这个并不能符合我转移workspace的需求,于是乎~~~~~~ 为了转移workspace后,不影响现在eclipse的使用,决定采用软链接的方式。 ============windows如何创建软链接============ 上网上搜索了资料,得知可以使用如下三种方法来实现,Junction,GNU utilities for Win32,Total Commander (这三个软件在下面的”本文软件网址”中,都附有链接,可以到其网站上去下载) 下面分别说说这三种的不同用法以及主要区别, 情景:workspace转移后在c:\workspace,要求访问e:\workspace等于访问c:\workspace, 首先,Junction, 命令如下: junction -s e:\workspace c:\workspace 加-s的意思是对子目录执行递归操作, 命令行会显示: Created: e:\workspace Targetted at: c:\workspace 好了,现在华丽的访问e:\workspace吧,已经跟c:\workspace一模一样了, 而且,我向e:\workspace加入了200M的文件,并没有占用E盘的空间,而是占用C盘的空间。 好,现在来删除e:\workspace软链接,使用如下命令: junction -d e:\workspace 命令行会显示:Deleted e:\workspace. 这时的e:\workspace已经没有了,c:\workspace还完好无缺。 满足要求! 【网上有人提到过: 需要注意的是,Explorer 对待 symbolic link 有一个很奇怪的行为。 那就是,在 Explorer 里一个 symbolic link 跟被它 link 的目录没有区别, 删除这个 symbolic link 将会删除被 link 的目录下的所有文件! 】 但是我在vista系统下测试,删除了e:\workspace,c:\workspace仍然好好的存在。 ————————————————– 再来看看GNU utilities for Win32 先下载,下载后,是个zip压缩包,解压缩后,会看到如下的一个目录结构: UnxUtils\usr\local\wbin 这里面的N多命令,其中的ln.exe就是咱们要使用的来, 【PS:UnxUtils\bin这个目录下有个sh.exe,我一运行就报错,不用去管它,感觉这个就是个加载器,运行后会加载到它的shell环境中, 我把UnxUtils\usr\local\wbin设置在了系统的环境变量中,也可以和方便的在cmd中直接使用每个命令。】 像在linux下一样,在cmd中执行 ln -s c:\workspace e:\workspace 命令行提示: ln: symbolic links are not supported on this system 阿门,不支持,放弃~~~正如网上所说,这个工具包的ln只能创建硬链接。 虽然ln不支持,但是这个软件包的其他命令还是很不错滴,例如grep,可以很方便的搜索windows文件了,要比windows的垃圾搜索好很多。 ————————————————– 来看看Total Commander吧, 下载下来是个安装包,最新的版本已经内置了中文,安装时可以选择中文,并且可以不安装其他的语言,以节省空间。 下载,安装,并没有发现可以做软链接的功能,忽略。 但是这个作为资源管理器的替代者倒是很强大,又发现了个很好滴工具。 ————————————————– 总结:在windows下创建软链接,使用junction。 ============本文软件网址============ Windows Sysinternals > 下载 > File and Disk Utilities > Junction v1.04 GNU utilities for Win32 Total Commander ============本文windows命令部分参考============ 硬链结和符号链接的区别 Q: how to create a symbolic link under Win2K, WinXP, and above? NTFS 下的硬链接(hard link)与符号链接(symbolic link) ============附:硬链结和符号链接的区别============ 硬连接记录的是目标的 inode,符号连接记录的是目标的 path。 软连接就像是快捷方式,而硬连接就像是备份!符号连接可以做跨分区的 link;而 硬连接由于 inode 的缘故,只能在本分区中做 link.所以,符号连接的使用频率要高的多。 存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软连接指向的是路径(path) 软链接文件 软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。链接文件甚至可以链接不存在的文件,这就产生一般称之为”断链”的问题(或曰“现象”),链接文件甚至可以循环链接自己。类似于编程语言中的递归。 命令格式: 代码: ln [-s] source_path target_path 硬链接文件 info ln 命令告诉您,硬链接是已存在文件的另一个名字,硬连接的命令是 代码: ln -d existfile newfile 引用: 硬链接文件有两个限制 1、不允许给目录创建硬链接; 2、只有在同一文件系统中的文件之间才能创建链接。 对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修改 代码: $umask 022 $ cp /etc/httpd/conf/httpd.conf /usr/sam 原来前面做的试验,改变了系统默认的umask值,现在改回来为022, 举个httpd.conf文件做例 子 代码: $ ln httpd.conf httpd1.conf $ ln -s httpd.conf httpd2.conf 第一条为硬链接,第二条为软链接 代码: $ ls -li 代码: 总用量 80 1077669 -rw-r–r– 2 sam adm 34890 10月 31 00:57 httpd1.conf 1077668 lrwxrwxrwx 1 sam adm 10 10月 31 00:58 httpd2.conf ->; httpd.conf 1077669 -rw-r–r– 2 sam adm 34890 10月 31 00:57 httpd.conf 可以看到,使用ls -li,软连接只产生了10字节的快捷而已,硬连接却实实在在的的拷贝。最前面的inode硬链接和源文件是一样的,而软链接不一样,具体看一下回复 对http1.conf进行编辑,可以发现httpd.conf也发生了一样的变化 代码: $ rm httpd.conf 现在删除链接的源文件,来比较不同之处 代码: $ ls -l 总用量 44 drw-r–r– 2 sam adm 4096 10月 30 20:14 file6 -rw-r–r– 1 sam adm 34890 10月 31 00:57 httpd1.conf lrwxrwxrwx 1 sam adm 10 10月 31 00:58 httpd2.conf ->; httpd.conf 我的结论就是:硬链结只有全部被删除的时候,文件才无法访问,但是软链接,只要他的源文件消失了,这个文件就无法访问了。软链接就是记录了文件路径的一种特殊文件。 |
![]() |
![]() |