LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 716|回复: 8

判别若干个路径指向相同的难题

[复制链接]
发表于 2003-6-27 00:57:43 | 显示全部楼层 |阅读模式
若有 /abc/xyz, ~/efg/bak/hello.java, /home/orca/bak/hello.java,
/abc/aaa,....
若干个路径。在bash中怎样编程判别若干个路径指向相同。
例如:~/efg/bak/hello.java, /home/orca/bak/hello.java指向同一文件。
 楼主| 发表于 2003-6-27 01:01:04 | 显示全部楼层

补充

在编写多目标copy脚本时,十分有用。
必须识别指向相同的目标路径。
mcp source dest1 dest2 ...
发表于 2003-6-27 05:24:29 | 显示全部楼层
一般的判断用dirname就行
比如
fancyworld lucida $ dirname ~lucida/myfile
/home/lucida
fancyworld lucida $ dirname /home/lucida/myfile
/home/lucida

如果涉及到相对路径(比如../../a/b/c实际等于/some/path/to/a/b/c)
我知道的办法只有
cd $(dirname ../../a/b/c/myfile)
abspath=$(pwd)
cd -
发表于 2003-6-27 10:40:50 | 显示全部楼层

我想比较inode会是个好办法

FILE=~/bin
INODE=`/bin/ls -1di $FILE | sed -e 's/^[ ]*//' -e 's/[ ].*$//'`
发表于 2003-6-27 10:57:46 | 显示全部楼层
这个也不能处理相对路径....
发表于 2003-6-27 11:19:51 | 显示全部楼层
grampus主要想确定mcp source dest1 dest2 ...中dest1、dest2...所指定的这些目录是否为同一个目录:
idkey的方法可以判断符号链接,如果它们的inode值相同,指的就是同一个目录,但不能处理相对路径,因为这是shell定义的;penny的方法可以处理相对路径,但不能处理符号链接。
将两人的方法结合一下,先扫描相对路径,再判断inode值,就OK了。
 楼主| 发表于 2003-6-27 20:18:35 | 显示全部楼层

补充说明

可能是我没解释清楚。
mcp source dest1 dest2 ...
这dest1,dest2...可能是用户指定的目标文件,也可能只是一个目录。
所以不能仅假设是目录或文件。所以需要分别处理。
还有以使用cp的常识,我们知道,dest1...可能在指定时并不存在。
所以用inode判断要选建立一个临时文件。
发表于 2003-6-28 20:48:21 | 显示全部楼层
> idkey的方法可以判断符号链接,如果它们的inode值相同,指的
> 就是同一个目录,但不能处理相对路径,因为这是shell定义的;
> penny的方法可以处理相对路径,但不能处理符号链接。
不知道你什么意思。就因为相对路径的写法不一样就不是同一个对象、不是相同的inode了吗?还是好好温习一下filesystem的概念吧。不管你用什么名字引用它,链接也好、100种相对路径的写法也好,你最后访问的还是fs中的数据块;而fs如何区分不同的数据块呢,在ext2里,就是inode,节点索引。它在整个partition中是唯一的值呀,sir。如果一个目录(也包括文件),就因为访问它是通过链接或者n种相对路径的写法,它的inode就会不一样,那ext2驱动和硬盘控制器还不得疯掉,嘿嘿。

> 所以不能仅假设是目录或文件。所以需要分别处理。
> 还有以使用cp的常识,我们知道,dest1...可能在指定时并不存在。
> 所以用inode判断要选建立一个临时文件。
忘了shell可以判断一个目录、文件是否存在吗?
if [ -f source ]; then
[ -f $dest1 ] || ( [ -d `dirname $dest1` ] || mkdir -p `dirname $dest1` ); touch $dest1
[ -f $dest2 ] || ( [ -d `dirname $dest2` ] || mkdir -p `dirname $dest2` ); touch $dest2
# then check inodes & copy
...
else if [ -d source ]; then
[ -d $destdir ] || mkdir -p $destdir
[ -d $destdir2 ] || mkdir -p $destdir2
# then check inodes & copy
...
else
echo "Source $source does not exists"
fi
fi
瞎写的,检测还不严格,没有考虑目标即可以是目录也可以是文件的境况等等,而且我也没有调试,仅供参考。
发表于 2003-6-28 21:44:49 | 显示全部楼层
idkey兄的方法是有道理的,不过文件的名字如何变化,链接也好,别名也罢,他的inode是唯一的!
我建议楼主把自己的文档帖出来,便于我们大家分析,没有必要为一个概念争来争去,因为概念(理论)是死的,如何应用却是灵活的!
个人看法,供参考!;)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表