Yanıtlar:
-fKurallı 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 readlinkayrış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 ( readlinkbunun için kullanın ), ancak karmaşasını olmadan bağlantı adını ve hedefini gösterir.ls -l
-cyazılabilir --formatve %N“sembolik link varsa, referanslı alıntı” anlamına gelir.
Bu readlinkiyi 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 lskutu içinde de ayrıştırılmasına bashharici komutu gibi bağlı olmadan awk, sedya da perl.
Bu bash_realpathiş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 -lbö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 sediç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
rwhichwhichtü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-xtarafı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 -lsaş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.