Bagaimana mendapatkan path lengkap ke target tautan

13

Jika saya memiliki tautan simbolis /var/opt/foodibuat ln -fs /path/to/target/dir foo. Bagaimana saya bisa dalam skrip yang hanya melihat tautannya /path/to/target/dir?

Apa yang ingin saya capai dalam naskah adalah rm -rf /path/to/target/dirsebelum saya melakukannya ln -fs /path/to/another/dir foo.

Nifle
sumber

Jawaban:

30
link=/var/opt/foo

target=$(readlink "$link")

$target sekarang menjadi target tautan, persis seperti yang disimpan dalam sistem file.

Symlinks bisa relatif, jadi ini akan lebih baik untuk penggunaan normal:

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

Perhatikan bahwa ini menggunakan readlinkdari GNU Coreutils, yang mungkin tidak ada di BSD dan sistem lainnya.

Sunting: readlink -f berfungsi pada BSD, selama target tautan ada. realpathadalah alat lain, hanya BSD, yang bekerja dengan cara yang sama.

pengguna1686
sumber
1
BSD telah melakukan readlink()panggilan sistem sejak zaman 4.2BSD. readlink Utilitas BSD saat ini dirilis dengan FreeBSD 4.10. Itu (kembali) diimplementasikan sebagai tautan keras untuk statperintah ( halaman manual MacOS X halaman manual FreeBSD 9 ). Perhatikan bahwa tidak ada -mopsi.
JdeBP
@ JdeBP: Terima kasih. Itu memang memiliki -f, dan readlink -fberfungsi dengan baik (dengan asumsi target tautan ada). Dalam BSD, realpathtampaknya menjadi alternatif lain readlink -m.
user1686
0

Salah satu caranya adalah (Saya berharap untuk versi yang lebih baik)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"
Nifle
sumber
4
readlinkadalah temanmu
JdeBP