Symlink'in sadece varış yerini bulun


50

Bir kabuk betiğinde kullanım için, sembolik bir bağlantının hedefini bulmak için bir komut satırı yolu arıyorum. Şimdiye kadar geldiğim en yakın şey stat -N srcçıktı src -> dst. Tabii ki çıktıyı ayrıştırabilir ve alabilirim dst, ancak varış yerine ulaşmanın doğrudan bir yolu olup olmadığını merak ediyorum.

Yanıtlar:


61

Başka bir seçenek, readlinkeğer varsa , özel olarak tasarlanmış komutu kullanmak olacaktır .

Örneğin

$ readlink -f `command -v php`
/usr/bin/php7.1

21
Kullanım readlink -fbilmeni istiyorum eğer son Sembolik bağ hedefi ve sadece bir sonraki tane.
scai 10:12

İyi bir nokta! Unut bunu.
nikitautiu 10:12

11
GNU'ya -ftaşınabilir olmayan bir eklenti olduğunu unutmayın readlink.
bahamat

2
Okuma bağlantısı ne zaman kullanılamaz? Teşekkürler.
tommy.carstensen

2
@ tommy.carstensen readlink (1) 2003 yılında GNU coreutils'e eklendi, bu yüzden bugünlerde coreutils kullanan pratik olarak tüm sistemlere bağlı olabilirsiniz. (Bkz. Git.savannah.gnu.org/cgit/coreutils.git/commit/src/… )
Josip Rodin,

15

Mac OS X ve FreeBSD / NetBSD / etc üzerinde. onun:

stat -f %Y <filename>

Daha genel olarak, çözümün şu olduğunu düşünüyorum (stat --printf =% N, garip alıntılar kullanıyor):

ls -l b | sed -e 's/.* -> //'

Örnek:

# ln -s a b
# stat -f %Y b
a

Başka bir yöntem:

# find b -maxdepth 0 -printf %l
a#

Son satır, yeni bir satır olmadığından karışıktır, ancak sonuçta bir değişkene ihtiyacınız varsa, böyle olur.

# f=$(find b -maxdepth 0 -printf %l)
# echo $f
a

Bir dizin olursa dizine düşmesini -maxdepthönlemek gerekir.findb


Ben tamamen gözden kaçırdım stat --printf='%N\n', tam istediğim bu, garip alıntılar beni rahatsız etmiyor, aynı alıntılar rm ve ln
etkileşimli

Bu görünüşte taşınabilir değil çünkü Linux'ta GNU coreutils'in stat (1) 'in farklı parametreleri var ve link -> destçıktıda yazdırıyor . Bulma (1) çözümü GNU buluntuları ile mi yoksa başkaları ile mi kontrol edilmeli ...
Josip Rodin

Lütfen değişken genişlemelerinizden alıntı yapmayı unutmayın, echo $fkesinlikle sembolik bağlantı işaret ettiğinde beklediğiniz şeyi vermez /*(evet mümkün)
Camusensei

3

Bu GNU find: kullanılarak yapılabilir find src -prune -printf "%l\n".


1

Portatif olarak: ls -l çıktısını ayrıştırmak için sezgisel tarama kullanmak ya da kullanmak dışında şans yok perl -le 'print readlink("some-file")'

bazı sistemlerde bir readlinkkomut var, bazıları -fise mutlak yolu elde etme seçeneğine sahip.

/ System çağrıları statiçin bir komutun sarıcı olarak çeşitli uygulamaları vardır . GNU olanı bu konuda yararlı değildir, ancak zsh'ın yerleşik olanı daha doğrudur:statlstat

zmodload zsh/stat
stat +link the-link

Yine de zsh ile :Adeğiştiriciyle (değişken genişletme, tarih genişletme ve globbing için geçerli olan bir dosyanın mutlak yolunu (her bir bağlantı bileşenini kaldırır) alabilirsiniz.

~$ gstat -c %N b
`b' -> `a'
~$ var=b
~$ echo $var:A
/home/me/a
~$ echo b(:A)
/home/me/a
~$ echo ?(@:A)
/home/me/a

1

Komut readlinkveya statkomutun olmadığı bir sistemde ancak Python 2.x kullanıyorum, kısa bir komut dosyası kullanıyorum:

#!/usr/bin/env python

import os, sys

if __name__ == "__main__":
    src = sys.argv[1]
    target = os.readlink(src)
    if not os.path.isabs(target):
            target = os.path.abspath(os.path.join(os.path.dirname(src), target))
    print target

Bunun aksine readlink -fsadece bir sembolik bağlantı seviyesini takip edebileceğini unutmayın .


1

Taşınabilir saf Bash realpath

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

0

realpathcoreutilspaketin emri ,

Bağlantılı olarak readlinkkomutunun kılavuz sayfası.


Örneğin:

realpath /bin/python

çıktılar

/usr/bin/python2.7

benim makinemde.

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.