Yanıtlar:
-f
Kurallı sürümü yazdırmak için bayrağı kullanın . Örneğin:
readlink -f /root/Public/myothertextfile.txt
Kimden man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
brew install coreutils
. Bu, harfin önüne eklenmiş komutların gnu versiyonlarını kurar g
, yanigreadlink -f somefile
Ubuntu 18.04.1 LTS (Bionic Beaver)
readlink ait Man sayfalarından belirten bir not var "Not realpath (1) standartlaştırma anlamıyla çalışabilmesi için tercih komuttur."
readlink istediğiniz komuttur. Komutun man sayfasına bakmalısın. Çünkü gerçek dosyaya bir sembolik bağ zinciri takip etmek istiyorsanız, -e veya -f anahtarına ihtiyacınız vardır:
$ ln -s foooooo zipzip # fooooo doesn't actually exist
$ ln -s zipzip zapzap
$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo
$ # Follows it, but file not there
$ readlink -e zapzap
$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip
Bu da işe yarayacak:
ls -l /root/Public/myothertextfile.txt
ancak readlink
ayrıştırma yerine bir komut dosyasında kullanılması tercih edilir ls
.
Bağlantının kaynağını ve hedefini göstermek istiyorsanız, deneyin stat -c%N files*
. Örneğin
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
Ayrıştırma için iyi değil ( readlink
bunun için kullanın ), ancak karmaşasını olmadan bağlantı adını ve hedefini gösterir.ls -l
-c
yazılabilir --format
ve %N
“sembolik link varsa, referanslı alıntı” anlamına gelir.
Bu readlink
iyi bir şey, ancak GNU'ya özgü ve çapraz olmayan bir platform. Eskiden platformlar için scriptler yazıyordum /bin/sh
, bu yüzden şöyle bir şey kullanırdım:
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
veya:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
ancak bunların farklı platformlarda test edilmesi gerekiyor. Onlar çalışacaklarını düşünüyorum, ancak ls
çıkış biçimi için% 100 emin değilim .
Sonucu ls
kutu içinde de ayrıştırılmasına bash
harici komutu gibi bağlı olmadan awk
, sed
ya da perl
.
Bu bash_realpath
işlev, bir bağlantının son hedefini çözer (bağlantı → bağlantı → bağlantı → son):
bash_realpath() {
# print the resolved path
# @params
# 1: the path to resolve
# @return
# >&1: the resolved link path
local path="${1}"
while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
do
path="${BASH_REMATCH[1]}"
done
echo "${path}"
}
Eğer kullanamıyorsanız readlink
, o sonucunu ayrıştırma ls -l
böyle yapılabilir.
Normal sonuç şöyle olurdu:
ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan 1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt
Bu yüzden "->" dan önceki herşeyi değiştirmek ve ok dahil etmek istiyoruz. Bunun sed
için kullanabiliriz :
ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
Bu soru, brian-brezilya gibi basit bir cevap verecek kadar doğru değil:
readlink -f some_path
Gerçekten KQUEUE edecek katılan her sembolik bağ yolunda için inşa nihai hedefin arkasında some_path
.
Ancak, basamaklı sembolik zincirlerin bir seviyesi, sistemdeki diğerleri arasında sadece özel bir durumdur, genel durum N basamaklı sembolik işaretlerdir. Sistemimde aşağıdakilere bakın:
$ rwhich emacs
/usr/bin/emacs
/etc/alternatives/emacs
/usr/bin/emacs24-x
rwhich
which
tüm ara basamaklı sembolik bağları (stderr'e) nihai hedefe (stdout'a kadar) basan kendi özyinelemeli uygulamam .
O zaman ne olduğunu bilmek istersem:
symlink / usr / bin / emacs ** hedefi, bana verilen açık cevap /etc/alternatives/emacs
:
readlink $(which emacs)
readlink /usr/bin/emacs
Nihai sembolik bağlar basamaklı arkasında hedef / usr / bin / emacs, cevap olacaktır /usr/bin/emacs24-x
tarafından döndürülen:
readlink -f $(which emacs)
readlink -f /usr/bin/emacs
rwhich emacs 2>/dev/null
Bir klasördeki ve alt klasöründeki tüm bağlantıların hedefini bulursanız, find . -type l -ls
aşağıdaki gibi bağlantı türünü kullanarak komutu kullanın:
me@local.localdomain:~/test$ find . -type l -ls
8601855888 0 lrwxr-xr-x 1 me staff 6 Jan 24 19:53 ./link -> target
Tek bir hedef istiyorsanız, o zaman ls -l
çalışması gerekir:
me@local.localdomain:~/test$ ls -l
total 0
lrwxr-xr-x 1 me staff 6 Jan 24 19:53 link -> target
-rw-r--r-- 1 me staff 0 Jan 24 19:53 target
readlink -f
.