it-swarm.asia

Komut satırı üzerinden sembolik bağlantı hedefini bulma

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ı?

141
Jared

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
184
brian-brazil

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
25
Kyle Brandt

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.

5
Robert Siemer

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
    
1
Nico

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
1
7ochem

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

0
Mantz

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
0
Memin