Diyelim ki sembolik bir bağlantı kurdum:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
myothertextfile.txt
hedefinin komut satırını ne kullandığını görmenin bir yolu var mı?
Standartlaştırılmış sürümü yazdırmak için -f
Bayrağını kullanın. Örneğin:
readlink -f /root/Public/myothertextfile.txt
man readlink
'Dan:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
readlink istediğiniz komuttur. Komut için man sayfasına bakmalısınız. Çünkü gerçek dosyaya bir sembolik bağlantı zinciri izlemek 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 yarayacaktır:
ls -l /root/Public/myothertextfile.txt
ancak readlink
kodunu ls
ayrıştırmak yerine kullanmak için tercih edilir.
Bağlantının kaynağını ve hedefini göstermek istiyorsanız, stat -c%N files*
Komutunu deneyin. Ö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ğildir (bunun için readlink
kullanın), ancak ls -l
Karmaşası olmadan bağlantı adını ve hedefini gösterir.
-c
Yazılabilir --format
Ve %N
“Sembolik bağlantı varsa dereference ile alıntı yapılan dosya adı” anlamına gelir.
readlink
iyi bir şey, ancak GNU'ya özgü ve çapraz olmayan platform. /bin/sh
İçin platformlar arası komut dosyaları yazıyordum, 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 gerekir. Sanırım çalışacaklar ama ls
çıktı formatı için% 100 emin değilim.
ls
sonucu, bash
, awk
veya sed
gibi harici bir komuta bağlı kalmadan Perl
içinde ayrıştırılabilir.
Bu bash_realpath
İşlevi, 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}"
}
Soru brian-brezilya'nın cevabı olarak basit bir cevap verecek kadar doğru değil:
readlink -f some_path
gerçekten de dereference dahil olan her sembol bağlantısıson hedef arkasındaki some_path
.
Ancak bir basamaklı sembolik düzey, bir sistemdeki diğerleri arasında sadece belirli bir durumdur, genel durum N basamaklı sembolik düzeylerdir. Sistemimde aşağıdakilere bakın:
$ rwhich emacs
/usr/bin/emacs
/etc/alternatives/emacs
/usr/bin/emacs24-x
rwhich
, tüm ara basamaklı simgeleri (stderr'a) son hedefe (stdout'a) basan which
özyinelemeli uygulamasıdır.
Sonra ne olduğunu bilmek istiyorsanız:
symlink'in hedefi/usr/bin/emacs **, bana açık cevap /etc/alternatives/emacs
tarafından döndürülen:
readlink $(which emacs)
readlink /usr/bin/emacs
basamaklı sembollerin arkasındaki nihai hedef/usr/bin/emacs, cevap /usr/bin/emacs24-x
tarafından döndürülen:
readlink -f $(which emacs)
readlink -f /usr/bin/emacs
rwhich emacs 2>/dev/null
readlink
kullanamıyorsanız, ls -l
böyle yapılabilir.
Normal sonuç:
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 her şeyi "->" ve oku da dahil etmeden önce değiştirmek istiyoruz. Bunun için sed
kullanabiliriz:
ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
ll
veya ls -l
sembolik bağlantınız ve hedefiniz de dahil olmak üzere dizin öğelerini listelemelidir
cd -P /root/Public/myothertextfile.txt
(sizin durumunuzda) orijinal yolu göstermelidir
Bir klasördeki ve alt klasöründeki tüm bağlantıların hedefini bulursanız find . -type l -ls
komutunu aşağıdaki link türüyle yazın:
[email protected]:~/test$ find . -type l -ls
8601855888 0 lrwxr-xr-x 1 me staff 6 Jan 24 19:53 ./link -> target
Bir single'ın hedefini istiyorsanız, ls -l
çalışmalı:
[email protected]:~/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