当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 6 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 如何判断硬链接
帖子发表于 : 2011-05-26 15:36 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: freebuilder@yeah.net
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
代码:
>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$


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


最后由 自由建客 编辑于 2011-05-26 20:02,总共编辑了 2 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 如何判断硬链接
帖子发表于 : 2011-05-26 15:43 
头像

注册: 2007-03-02 17:36
帖子: 7281
送出感谢: 3
接收感谢: 99
"只用 ls -i 判断硬链接不可靠,除非确定在同一文件系统"

没明白,不在同一文件系统也能硬链接??


_________________
虽然世上没有完美的东西,但这并不影响我们追求完美,因为只有偏执狂才TMD能成功。
10.04新手入门——笨兔兔讲述自己的故事


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 如何判断硬链接
帖子发表于 : 2011-05-26 15:59 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: freebuilder@yeah.net
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
懒蜗牛Gentoo, 不能硬链接,但可能有相同的索引节点号,看最上面的例子。所以通过 ls -i 看索引节点号是否相同来判断硬链接不可靠。


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 如何判断硬链接
帖子发表于 : 2011-05-26 19:31 

注册: 2009-08-28 15:00
帖子: 110
送出感谢: 0 次
接收感谢: 2
代码:
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。

希望对你有用。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 如何判断硬链接
帖子发表于 : 2011-05-29 1:09 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: freebuilder@yeah.net
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
代码:
#!/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

真够费劲的!


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 如何判断硬链接
帖子发表于 : 2011-05-30 17:08 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: freebuilder@yeah.net
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
代码:
#!/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 !


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 6 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译