Как сравнить 2 символические ссылки в Unix (Linux)? - PullRequest
3 голосов
/ 14 июля 2009

Каким будет элегантный способ сравнения двух символических ссылок в Unix?

Предположим, я ввел следующие команды:

ln -s /usr/share/g s1
ln -s /usr/share/g s2
ln -s ../share/g /usr/lib/s3
ln -s /usr/share/h s4

тогда я хотел бы иметь команду, которая говорит, что s1 и s2 равны (неважно, существует ли / usr / share / g на самом деле, не имеет значения), что s1 и s4 не равны, s2 и s4 не равны. (Для моей цели достаточно, чтобы сообщалось, что s3 отличается от s1 и s2; однако, если можно провести сравнение после нормализации пути, это может быть полезно.)

Ответы [ 4 ]

12 голосов
/ 14 июля 2009

Для систем GNU (и, возможно, других, но я не могу сказать), есть readlink(1):

$ touch a
$ ln -s a b
$ readlink b
a

Вы можете использовать это в сравнениях:

$ test $(readlink -f a) = $(readlink -f b)
$ echo $?
0
3 голосов
/ 14 июля 2009

Вы можете сделать stat -L для файла и сравнить номер устройства и индекса. Быстрый пример:

#!/bin/bash
DI_A=$(stat -c "%d.%i" -L "$1")
DI_B=$(stat -c "%d.%i" -L "$2")

if [ "$DI_A" == "$DI_B" ]; then
   echo "same file"
else
   echo "other file"
fi
0 голосов
/ 14 июля 2009

2 способа, о которых я могу думать, вы можете использовать ls -l для обоих файлов. после «->» вы можете увидеть фактический путь.eg

# ls -ltr msdfasdffff
lrwxrwxrwx 1 root root 10 Jun 30 19:05 msdfasdffff -> blah.sh

вы можете получить имя файла, используя

# ls -l msdfasdffff  | awk -F"-> " '{print $NF}'
blah.sh

тогда можно сравнить с другой ссылкой.

другой способ - найти find

# var1=$(find . -name "s1" -printf "%l")
# var2=$(find . -name "s2" -printf "%l")

тогда вы можете сравнить 2 переменные, используя if / else

0 голосов
/ 14 июля 2009

Либо используйте stat -L, либо проанализируйте вывод ls -l (с помощью sed или cut или аналогичного):

fileone=`ls -l s1 | sed 's/.*-> //'`
filetwo=`ls -l s2 | sed 's/.*-> //'`
if [ "$fileone" = "$filetwo" ]
then
    echo "They're the same!"
fi

Чтобы нормализовать путь, используйте realpath:

fileone=`ls -1 s1 | sed 's/.*-> //'`
fileone=`realpath $fileone`
# etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...