Sembolik bağlantı hedefini komut satırıyla bulun


130

Sembolik bir bağlantı kurduğumu söyle:

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

hedefini myothertextfile.txtkomut satırını kullanarak görmek için bir yolu var mı?

Yanıtlar:


171

-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

8
Başka bir soruda önerildiği gibi kullanmak isteyebilirsiniz readlink -f.
Denilson Sá Maia

5
Bunun Mac OS X'te çalışmasını sağlamak için brew install coreutils. Bu, harfin önüne eklenmiş komutların gnu versiyonlarını kurar g, yanigreadlink -f somefile
Mike D 20

-f anahtarıyla, komut benim durumumda hiçbir şey döndürmez ..
sotn

-F kullanımı bana istediğim bilgiyi verdi, yani birden fazla sembolik bağlantıyı çözme ve son hedefi gösterme.
isapir

üzerinde 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."
Sam Kamensky

23

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

İlk cevapta yanlış olan bir şey yok, ama bu daha eksiksiz ve yardımcı.
Mike S

6

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.


4

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.


2

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}"
}

1

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

1

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
    

0

llveya ls -lsembolik bağlantınız ve hedefi dahil olmak üzere dizin öğelerini listelemelisiniz

cd -P /root/Public/myothertextfile.txt (senin durumunda) orijinal yola işaret etmeli


0

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.