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.