TL; DR:为什么[ symlink_to_file_a -ef file_a ]
返回true?
我需要测试文件 b (主要是符号链接)是否与文件 a 相同,以便了解 a 和 b 很难联系在一起,如果不是这样的话,就会把它们硬连接起来
我使用条件表达式-ef
和bash manual说:
file1 -ef file2
如果file1和file2引用相同的设备和inode编号,则为True。
我只比较符号链接/常规文件和 a 和 b 的inode不同,但结果为True
。
类似question的答案说:
如果是,那么目标和链接的inode编号是否相同?
没有。通常,符号链接是一个具有自己的inode的文件(具有文件类型,自己的数据块等)。
我不确定我的理解但我可能会在ext4 spec找到一些解释:
如果目标字符串长度小于60个字节,则符号链接的目标将存储在此字段中。否则,将使用范围或块映射来分配数据块以存储链接目标。
我试过目标更短/超过60B,但没有区别。
$ cat test.sh
#!/usr/bin/env bash
foo="foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"
mkdir /tmp/test
cd /tmp/test
touch a
ln -s /tmp/test/a b
ls -li
if [ a -ef b ]
then
echo b : same device or inode of a
else
echo b : different device or inode of a
fi
mkdir /tmp/test/${foo}
cd /tmp/test/${foo}
touch c
ln -s /tmp/test/${foo}/c d
ls -li
if [ c -ef d ]
then
echo d : same device or inode of c
else
echo d : different device or inode of c
fi
$ ./test.sh
156490 -rw-rw-r-- 1 msi msi 0 nov. 25 23:55 a
156491 lrwxrwxrwx 1 msi msi 11 nov. 25 23:55 b -> /tmp/test/a
b : same device or inode of a
total 4
156494 -rw-rw-r-- 1 msi msi 0 nov. 25 23:55 c
156495 lrwxrwxrwx 1 msi msi 155 nov. 25 23:55 d -> /tmp/test/foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo/c
d : same device or inode of c
Inodes不同但测试成功,我没有看到什么是错误的。
答案 0 :(得分:1)
似乎文档在某些地方会产生误导。来自http://www.tldp.org/LDP/abs/html/fto.html:
f1 -ef f2
文件 f1 和 f2 是指向同一文件的硬链接
正如您已经发现的那样,该表达式不仅对于硬链接而且对于同一文件的 soft 链接都返回true。
改为使用stat
:
if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]
来源: https://superuser.com/questions/196572/check-if-two-paths-are-pointing-to-the-same-file