รับเส้นทางแบบเต็มไปยังเป้าหมายของลิงก์ได้อย่างไร


13

ถ้ามีการเชื่อมโยงสัญลักษณ์ที่สร้างขึ้นด้วย/var/opt/foo ln -fs /path/to/target/dir fooฉันสามารถในสคริปต์ที่เห็นเพียงการเชื่อมโยงได้รับการ/path/to/target/dir?

สิ่งที่ฉันต้องการที่จะประสบความสำเร็จในสคริปต์ก่อนที่ผมจะทำrm -rf /path/to/target/dirln -fs /path/to/another/dir foo

คำตอบ:


30
link=/var/opt/foo

target=$(readlink "$link")

$target ตอนนี้เป็นเป้าหมายของลิงก์เหมือนกับที่จัดเก็บไว้ในระบบไฟล์

Symlink อาจเป็นแบบสัมพัทธ์ได้ดังนั้นสิ่งนี้จะดีกว่าสำหรับการใช้งานปกติ:

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

โปรดทราบว่าสิ่งนี้ใช้readlinkจาก GNU Coreutils ซึ่งอาจไม่มีอยู่ใน BSD และระบบอื่น ๆ

แก้ไข: ใช้ readlink -fงานได้กับ BSD ตราบใดที่มีเป้าหมายลิงก์อยู่ realpathเป็นอีกหนึ่งเครื่องมือ BSD เท่านั้นที่ทำงานในลักษณะเดียวกัน


1
BSD มีการreadlink()เรียกระบบตั้งแต่วันที่ 4.2BSD readlink ยูทิลิตี้ BSDs ปัจจุบันได้รับการเผยแพร่ด้วย FreeBSD 4.10 มันถูกนำไปใช้เป็นฮาร์ดลิงก์สำหรับstatคำสั่ง ( หน้าคู่มือ MacOS X หน้าคู่มือ FreeBSD 9 ) ขอให้สังเกตว่ามันไม่มี-mตัวเลือก
JdeBP

@JdeBP: ขอบคุณ มันมี-fและreadlink -fทำงานได้ดีเช่นกัน (สมมติว่าเป้าหมายลิงก์มีอยู่) ใน BSD, ดูเหมือนจะเป็นอีกทางเลือกหนึ่งที่จะrealpath readlink -m
user1686

0

วิธีหนึ่งคือ(ฉันหวังว่าจะเป็นรุ่นที่ดีกว่า)

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

4
readlinkเป็นเพื่อนของคุณ.
JdeBP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.