如何判断硬链接

重复贴和参考价值不大的帖子,版主维护
回复
头像
自由建客
论坛版主
帖子: 13442
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

如何判断硬链接

#1

帖子 自由建客 » 2011-05-26 15:36

代码: 全选

>0< work$ ls -li /usr/bin/tic /home/fb/work/fonts/microsoft/simsun-yahei-mono-1.0.20100530/simsunbd.ttc
524799 -rw-r--r-- 1 fb   users 13655024  5月 29 2010 /home/fb/work/fonts/microsoft/simsun-yahei-mono-1.0.20100530/simsunbd.ttc
524799 -rwxr-xr-x 1 root root     49840  1月  4 11:33 /usr/bin/tic*

>0< work$ test /usr/bin/tic -ef /home/fb/work/fonts/microsoft/simsun-yahei-mono-1.0.20100530/simsunbd.ttc

>1< work$ touch t1

>0< work$ ln t1 t2

>1< work$ ln -s t1 t3

>0< work$ test t1 -ef t2

>0< work$ test t1 -ef t3

>0< work$ test \! \( -h t1 -o -h t2 \) -a t1 -ef t2

>0< work$ test \! \( -h t1 -o -h t3 \) -a t1 -ef t3

>1< work$
结论:
只用 ls -i 判断硬链接不可靠,除非确定在同一文件系统(或许还不够严谨,LVM、RAID 等情况尚不清楚)
只用 test -ef 同样不可靠,除非两个都不是软连接(同样或许还不够严谨,LVM、RAID 等情况尚不清楚)
还有什么别的方法不?

--------------------------------------------------------------------------------------
新发现情况更复杂了,上面的 test \! \( -h t1 -o -h t2 \) -a t1 -ef t2 也已经不凑效了。
这种情况,如何判断 t1 和 t2 是否是同一个硬链接呢?

代码: 全选

>0< urd$ ln -s /bin/sh t1

>0< urd$ ln t1 t2

>0< urd$ ln -s t1 t3

>0< urd$ ls -li t?
178539 lrwxrwxrwx 2 fb users 7  5月 26 19:58 t1 -> /bin/sh*
178539 lrwxrwxrwx 2 fb users 7  5月 26 19:58 t2 -> /bin/sh*
178547 lrwxrwxrwx 1 fb users 2  5月 26 19:58 t3 -> t1*

>0< urd$ test t1 -ef t2

>0< urd$ test t1 -ef t3

>0< urd$
上次由 自由建客 在 2011-05-26 20:02,总共编辑 2 次。
头像
懒蜗牛Gentoo
论坛版主
帖子: 7284
注册时间: 2007-03-02 17:36
送出感谢: 0
接收感谢: 95 次

Re: 如何判断硬链接

#2

帖子 懒蜗牛Gentoo » 2011-05-26 15:43

"只用 ls -i 判断硬链接不可靠,除非确定在同一文件系统"

没明白,不在同一文件系统也能硬链接??
虽然世上没有完美的东西,但这并不影响我们追求完美,因为只有偏执狂才TMD能成功。
10.04新手入门——笨兔兔讲述自己的故事
头像
自由建客
论坛版主
帖子: 13442
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: 如何判断硬链接

#3

帖子 自由建客 » 2011-05-26 15:59

懒蜗牛Gentoo, 不能硬链接,但可能有相同的索引节点号,看最上面的例子。所以通过 ls -i 看索引节点号是否相同来判断硬链接不可靠。
neil.sun
帖子: 110
注册时间: 2009-08-28 15:00
送出感谢: 0
接收感谢: 3 次

Re: 如何判断硬链接

#4

帖子 neil.sun » 2011-05-26 19:31

代码: 全选

ls -l

-rw-rw-r--  2 nansun users   21 May 26 19:05 hard
lrwxr-xr-x  1 nansun users    4 May 26 19:04 soft -> test
-rw-rw-r--  2 nansun users   21 May 26 19:05 test
第一列:hard link会显示为正常文件,soft link显示为link,l表示它是个soft link
第二列:test和hard都显示2,表示该文件有2个完全相同的副本,test就是hard,hard就是test。而soft link和原文件并不是同一个文件,所以soft显示为1。
第三列:用户名
第四列:组名。
第五列:test和hard的大小都是21,为什么是21呢?因为:

代码: 全选

cat test
this is a test file.
this is a test file.加上EOF(^D)共21个字符。

而soft的大小是4,为什么是4呢?因为soft link到test,test是4个字符。

最后一列:箭头表示这个是soft link.

所以ls -l的第二列是N的文件必有N-1个硬链接。

代码: 全选

rm hard
ls -l

lrwxr-xr-x  1 nansun users   4 May 26 19:04 soft -> test
-rw-rw-r--  1 nansun users   21 May 26 19:05 test
如果删掉源文件(或者硬链接),那么剩下的那个硬链接(或者源文件)第二列的数字会减1,如果这个数字减到0,文件会被真正删除,无法访问内容。

ls -l的第二列叫做number of links,很久很久以前只有hard link,后来才有soft link,所以这一列实际上是指number of hard links

所以回到你的问题上来,如果inode相同,但number of hard link都为1,必定是不同的文件。
反之,如果number of hard link大于一,且inode相同,则不一定就是硬链接。因为有可能跨文件系统。

所以,要在同一个文件系统里面找inode相同的文件。

虽然不确定你具体的需求是什么,但是:
  • cut可以取出某一列。
  • find有两个参数-xdev和-inum。
希望对你有用。
头像
自由建客
论坛版主
帖子: 13442
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: 如何判断硬链接

#5

帖子 自由建客 » 2011-05-29 1:09

代码: 全选

#!/bin/sh
TMP1=`stat -c %d $1`
TMP2=`stat -c %d $2`
TEMP1=`ls -i $1 | sed -n 's/^\s*\([0-9]\+\).*/\1/p'`
TEMP2=`ls -i $2 | sed -n 's/^\s*\([0-9]\+\).*/\1/p'`
if [ $TMP1 = $TMP2 -a $TEMP1 = $TEMP2 ]; then
	echo "Yes"
	return 0
else
	echo "No"
	return 1
fi
[/size]
真够费劲的!
头像
自由建客
论坛版主
帖子: 13442
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: 如何判断硬链接

#6

帖子 自由建客 » 2011-05-30 17:08

代码: 全选

#!/bin/sh
if [ `stat -c %d_%i $1` = `stat -c %d_%i $2` ]; then
   echo "Yes"
   return 0
else
   echo "No"
   return 1
fi
晕!上次竟然没看到 %i ![/size]
回复

回到 “归档贴”