2016-11-25 3 views
0

TL; DR: почему [ symlink_to_file_a -ef file_a ] return true?Сравните символическую ссылку и его цель с помощью теста bash -ef


мне нужно проверить, если файл б (в основном символический) то же самое, чем файл за попытку узнать, если и б трудно связаны друг с другом, и жесткая связь если это не так.
Я использую условное выражение -ef и bash manual говорит:

file1 -ef file2
Правда, если file1 и file2 относятся к одному устройству и номера индексных дескрипторов.

Я сравниваю только символьной ссылки/обычный файл и дескрипторы из и б различны, но результат True.

Ответ подобного question говорит:

Если да, то будет ли номер индекса будет одинаковым для цели и ссылок?

No. Обычно символическая файл со своим собственным иноду (с файлом типа, собственные блоки данных и т.д.)

Я не уверен, что я понял, но я может нашел некоторые объяснения по этому поводу в ext4 spec:

цель символической ссылки будут сохранены в этой области, если целевая строка длиной менее 60 байт. В противном случае для распределения блоков данных для хранения целевого объекта ссылки будут использоваться либо экстенты, либо карты блоков.

Я попытался использовать цель короче/длиннее 60В, но нет никакой разницы.

$ 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 

Иноды разные, но тест преуспевает, и я не видел, что не так.

+1

Обратите внимание, что в верхней части раздела руководства Вы связываетесь, он говорит: _Unless не указано иное, праймериз, которые работают с файлами следовать символические ссылки и работать с объектом ссылки, а не с самой ссылкой. То есть, за исключением случаев, когда проверка является символьной ссылкой (примерно), она использует системный вызов 'stat()', а не системный вызов 'lstat()'. Информация 'ext4' - это просто о дисковой памяти для пути, на который указывает символическая ссылка; это не влияет на функциональность (но незначительно влияет на производительность, поскольку дополнительный блок диска должен быть прочитан для очень длинных символических ссылок). –

+0

Я думал, что конкретная инструкция будет исчерпывающей:/Спасибо за это полное объяснение. – F4240

ответ

1

Похоже, что документация вводит в заблуждение в некоторых местах. От http://www.tldp.org/LDP/abs/html/fto.html:

f1 f2 -ef

файлов f1 и f2 являются жесткие ссылки на тот же файл

Как вы уже выяснили себя, что выражение истинно не только для жестких ссылок, а также для soft ссылок на этот файл.

Использование 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

Смежные вопросы