Yumuşak bir sembolik bağlantının orijinal dosyasının tam yolunu nasıl alabilirim?


99

scpBir sunucuya bir dosya istiyorum . Dosya sembolik bir bağlantıdır ve aslında yapmak istediğim kaynak dosyayı kopyalamak. Neyse, kaynak dosyanın yolunu elle izlemek istemiyorum, çünkü değiştirilebilir. Kaynak dosyanın mutlak yolunu bulabilirsem, onunla alabilirim sep. Yolu nasıl bulabilirim?


2
Çoğu scpsürüm varsayılan olarak sembolik izleri izler, değil mi? Kendinizinkini kontrol etmeli ve belki kendinize biraz iş kurtarmalısınız
jw013

@ jw103 Bana bildirdiğiniz için teşekkür ederiz. Bilmiyordum. :)
Eonil

2
Not: scp -rizleri takip etmeye zorlar.
Eonil

Yanıtlar:


129

Bu satırı dene:

readlink -f `which command`

Eğer commandsenin içindedir $PATHaksi tanıdığınız yolunu belirtmeniz gerekir, değişken.


12
-fara bağlantı hedefleri var olduğu sürece var olmayan bir nihai hedefe giden yolu döndürecektir ... Bundan -ekaçınmak için kullanın , örn. -eNihai hedef yoksa, null değerini döndürür.
Peter.O

10
-fOSX’de hatayla readlink: illegal option -- f. Çıkarma iyi çalıştı.
Heath Sınırlar

2
@HeathBorders OSX için, kurulu homebrew coreutils'iniz varsa, greadlinkbunun yerine kullanabilirsiniz .
Adam Gent,

23

Linux altında readlink, bir sembolik bağlantının içeriğini okur ve readlink -fsembolik olmayan bir şey bulana kadar sembolik bağlantıları, sembolik bağlantılar izler.

Bu olsa scp için gerekli değildir: scp her zaman sembolik bağlantıları izler (her zaman dosya içeriğini kopyalar, -pmümkünse dosya zamanlarını ve modlarını koruyor olması dışında meta verileri yok sayar ).

Kendinizi meta veri scp'nin koruyamadığı ve koruyamadığı şeyden hayal kırıklığına uğrarsanız, rsync kullanmanızı öneririm. Seçenek yokken, rsync, meta verileri yok sayarak dosya içeriğini kopyalar. Yaygın olarak kullanılan seçenek -atüm bahçe çeşitliliği meta verilerini korur (zamanlar, sembolik linkler, izinler ve mülkiyet) ve ACL'ler ve hard linkler gibi egzotik meta verileri korumak için seçenekler vardır.


readlink, okuma bağlantısı için yalnızca tek bir adım yapar. örneğin ubuntu'da / bin / zsh var, bu da / etc / alternatives / zsh ile bağlanır, ancak bu ikinci sembolik bağdır. Sonunda gerçek dosya ya da dizin yolunu alamayacağız. Aynı stat komutu ile. Yalnızca -f seçeneğine sahip olan readlink tüm çözümlemeleri yapar.
Znik

9

Ben komutunu kullanın ls, stat, readlink.

Dosyayı al /etc/localtimebir örnek olarak

[flying@lempstacker ~]$ ls /etc/localtime 
/etc/localtime
[flying@lempstacker ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug  2 22:41 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

Operasyon

Stat kullanarak

[flying@lempstacker ~]$ stat /etc/localtime
  File: ‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’
  Size: 35          Blocks: 0          IO Block: 4096   symbolic link
Device: fd01h/64769d    Inode: 272202388   Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-11-23 09:00:59.999887800 +0800
Modify: 2016-08-02 22:41:26.090389904 +0800
Change: 2016-08-02 22:41:26.090389904 +0800
 Birth: -
[flying@lempstacker ~]$ stat -c "%N" /etc/localtime
‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’

Readlink kullanma

[flying@lempstacker ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[flying@lempstacker ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai

Bu komut readlink -fdaha iyi gibi görünüyor .

açıklama

-f, --canonicalize: verilen adın her bileşenindeki her sembolik bağlantıyı arka arkaya izleyerek kanonlaştır; son bileşen hariç tümü var -man readlink


6

Stat size şu bilgileri verecek:

$ stat current
  File: `current' -> `/home/user/releases/build/'
  ...

readlink, okuma bağlantısı için yalnızca tek bir adım yapar. örneğin ubuntu'da / bin / zsh var, bu da / etc / alternatives / zsh ile bağlanır, ancak bu ikinci sembolik bağdır. Sonunda gerçek dosya ya da dizin yolunu alamayacağız. Aynı stat komutu ile. Yalnızca -f seçeneğine sahip olan readlink tüm çözümlemeleri yapar.
Znik

5

Ya yapabilirsin

readlink -f `which command`

veya Linux ile benzer bir şey alabilirsiniz

stat `which command` | grep File

Bunu bir komut dosyasına ekliyorsanız, hatayı inceleyin. Sym link orada olmadığı durumda hata mesajı görmek istemiyorsanız, gibi bir şey ile gitmek

readlink -f "`which command`" 

-f olmadan stat ve realink sadece tek bir adım atıyor. daha sonra daha iyi çağrı readlink -f.
Znik

3

Kullanırdım realpath <symlink>.

Muhtemelen 'kaynak' dediğiniz şey, kullanımına göre 'hedef' dosyasıdır ln:Usage: ln [OPTION]... [-T] TARGET LINK_NAME


Teşekkürler Bu bir çekicilik gibi çalıştı! Mac OSX ile! Nerede readlinkkesmedi ... aptal Mac. lol
JayRizzo

0

readlink -f 'which java' benim için işe yaramadı.

Ama bu yaptı:

readlink -f $(which java)

3
Çünkü öyle çalışmaz mı `değil '.. ama $()daha iyi uygulama neyse olduğunu.
Stephen Rauch

Neden aşağı oy verdin? Cevabım kabul edilebilir bir alternatiftir ve yorumun dediği gibi daha iyi bir uygulama.
Yaramaz0714

1
Aşağı oy kullananların çoğu da yorum yapmaz, bu nedenle aşağı oylama hakkında açıklama istemek, size nadiren bir açıklama getirir, çünkü aşağı oy veren zaten ayrılmıştır ve geri gelme olasılığı yoktur. Cevabınız için çalışmayan yazılan kodu kaldırmanızı öneririm. Temizlemek için zaman ayırırsanız ve neden $()daha iyi bir uygulama olduğunu açıklarsanız, oy kullanmaya razı olurum .
Stephen Rauch

Stephen'ın size açıkladığı gibi 'değil'. Kapsüllemelisin command, ama bu onaylanmadı. $ () kullanmak daha iyidir, çünkü kapsülleme $ ($ (command)) çok daha kolaydır ve özel olarak kaçmaya gerek yoktur. Sonra tercih edilir. İlk örneğinizde normal kesme işareti kullandınız, ardından readlink adında boşluk olan 'hangi java' isimli dosyayı bulmaya çalışıyor. Ancak, java ikili çalıştırılabilir yolunu bulmak için, java argümanıyla çağrılan bir komuttur.
Znik

0

MAC OX'de "-f" parametresi çalışmıyor, 'readlink' herhangi bir parametre olmadan çalışıyor.

KZs-MacBook-Pro:bin kz$ readlink -f pip3
readlink: illegal option -- f
usage: readlink [-n] [file ...]

KZs-MacBook-Pro:bin kz$ readlink pip3
../../../Library/Frameworks/Python.framework/Versions/3.7/bin/pip3
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.