Làm thế nào để có được đường dẫn đầy đủ đến mục tiêu của liên kết


13

Nếu tôi có một liên kết tượng trưng /var/opt/foođược tạo ra với ln -fs /path/to/target/dir foo. Làm thế nào tôi có thể trong một tập lệnh chỉ nhìn thấy liên kết có được /path/to/target/dir?

Những gì tôi muốn đạt được trong kịch bản là rm -rf /path/to/target/dirtrước khi tôi làm ln -fs /path/to/another/dir foo.

Câu trả lời:


30
link=/var/opt/foo

target=$(readlink "$link")

$target bây giờ là mục tiêu của liên kết, chính xác như nó được lưu trữ trong hệ thống tập tin.

Mặc dù vậy, các liên kết có thể là tương đối, vì vậy điều này sẽ tốt hơn cho việc sử dụng thông thường:

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

Lưu ý rằng điều này sử dụng readlinktừ GNU Coreutils, có thể không tồn tại trong BSD và các hệ thống khác.

Chỉnh sửa: readlink -f hoạt động trên BSD, miễn là mục tiêu liên kết tồn tại. realpathlà một công cụ khác, chỉ dành cho BSD, hoạt động theo cách tương tự.


1
Các BSD đã có một readlink()cuộc gọi hệ thống kể từ những ngày 4.2BSD. readlink Tiện ích BSD hiện tại đã được phát hành với FreeBSD 4.10. Nó đã được triển khai dưới dạng một liên kết cứng cho statlệnh ( trang hướng dẫn MacOS X trang hướng dẫn FreeBSD 9 ). Lưu ý rằng nó không có -mtùy chọn.
JdeBP

@JdeBP: Cảm ơn. Nó cũng có -f, và readlink -fhoạt động tốt như vậy (giả sử mục tiêu liên kết tồn tại). Trong BSD, realpathdường như là một thay thế khác cho readlink -m.
dùng1686

0

Một cách là (Tôi hy vọng cho một phiên bản tốt hơn)

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

4
readlinklà bạn của bạn.
JdeBP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.