Например, у меня есть файл a
, и я делаю следующее.
ln -s a b
ln -s b c
ln -s c d
Если я использую readlink d
, я получу c
. Поэтому мне нужно бежать много раз, чтобы получить a
.
Есть ли простой способ получить a
?
Обновление:
Если я хочу найти исходный файл /usr/bin/java
, я должен сделать это много раз, чтобы получить /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
. Файлы и ссылки не находятся в одной папке.
Вы можете использовать следующую функцию оболочки:
readmultilink () {
linkfile="$1"
if [ ! -L "$linkfile" ]; then
echo "$linkfile is not a simbolik link" >&2
return 1
fi
until [ ! -L "$linkfile" ]; do
lastlinkfile="$linkfile"
linkfile=$(readlink "$lastlinkfile")
done
readlink "$lastlinkfile"
}
Добавьте эту функцию в конец файла ~/.bashrc
, если хотите использовать ее каждый раз, когда открываете терминал.
Использование:
readmultilinks file_name
Например, для вашего примера readmultilinks d
, readmultilinks c
и readmultilinks b
вернет a
, но readmultilinks a
вернет a is not a simbolik link
.
Команда для следующих цепочек ссылок называется namei
ManPage sup>. Примеры:
$ touch a
$ ln -s a b
$ ln -s b c
$ ln -s c d
$ namei ./d
f: ./d
d .
l d -> c
l c -> b
l b -> a
- a
$ namei /usr/bin/java
f: /usr/bin/java
d /
d usr
d bin
l java -> /etc/alternatives/java
d /
d etc
d alternatives
l java -> /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java
d /
d usr
d lib
d jvm
d java-7-openjdk-i386
d jre
d bin
- java
Возможно, вам нужно найти вместо:
$ find -L . -samefile d
./b
./c
./d
./a
Или:
$ ls -i d
143075 d
$ find . -follow -print -inum 143075
.
./b
./c
./d
./a
В обоих случаях исходный файл является последним.