Bağlantının hedefine tam yol nasıl alınır?


13

İle /var/opt/foooluşturulmuş sembolik bir bağım varsa ln -fs /path/to/target/dir foo. Bir komut dosyasında yalnızca bağlantının alındığını nasıl görebilirim /path/to/target/dir?

Senaryoda başarmak istediğim şey benden rm -rf /path/to/target/dirönce ln -fs /path/to/another/dir foo.

Yanıtlar:


30
link=/var/opt/foo

target=$(readlink "$link")

$target artık bağlantının hedefi, tıpkı dosya sisteminde saklandığı gibi.

Symlinks göreceli olabilir, bu yüzden normal kullanım için daha iyi olurdu:

target=$(readlink -f "$link")

Bunun readlinkBSD ve diğer sistemlerde bulunmayan GNU Coreutils tarafından kullanıldığını unutmayın .

Düzenle: readlink -f bağlantı hedefi olduğu sürece BSD'lerde çalışır. realpathbenzer şekilde çalışan başka bir BSD'ye özgü araçtır.


1
readlink()BSD'ler 4.2BSD günlerinden beri bir sistem çağrısı yaptı. Mevcut BSD'lerin readlink programı FreeBSD 4.10 ile piyasaya sürüldü. statKomut için sabit bir bağlantı olarak (yeniden) uygulandı ( MacOS X kılavuz sayfası FreeBSD 9 kılavuz sayfası ). Bir -mseçeneği olmadığına dikkat edin .
JdeBP

@JdeBP: Teşekkürler. Var -fve aynı şekilde readlink -fçalışıyor (bağlantı hedefinin var olduğu varsayılarak). BSD'de, realpathbaşka bir alternatif gibi görünüyor readlink -m.
user1686

0

Bunun bir yolu (daha iyi bir sürüm olmasını umuyorum)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"

4
readlinksenin arkadaşın.
JdeBP
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.