วิธีรับเส้นทางที่แก้ไขอย่างสมบูรณ์ของลิงก์สัญลักษณ์ใน Terminal ได้อย่างไร


47

ฉันมีระเบียบของการติดตั้งหลามในแล็ปท็อปของฉันยุ่งเหยิง ฉันมองไปที่ไฟล์เอ็กซีคิ้วท์อิน/usr/local/binและพวกมันคือลิงก์สัญลักษณ์ทั้งหมด../../../Library......

มีพฤติกรรมแปลก ๆ รอบตัวนี้ ถ้าฉันls -lhaGเห็น--->และเส้นทางสัมพัทธ์ทางด้านขวาของ symlink:

lrwxr-xr-x  1 root  wheel    69B Dec  7 22:29 python3 -> ../../../Library/Frameworks/Python.framework/Versions/3.1/bin/python3

อย่างไรก็ตามฉันไม่สามารถรับเครื่องมือบรรทัดคำสั่งใด ๆ เพื่อแก้ไขพา ธ นั้นและแสดงพา ธ ที่แท้จริงไปยัง python3 ฉันได้พบเกร็ดเล็กเกร็ดน้อยที่นี่และมีเกี่ยวกับการใช้งานpwd -Pและfindยูทิลิตี้การทำเช่นนี้ ปัญหาคือสิ่งเหล่านี้ดูเหมือนจะไม่ทำงานบน OS X ในแบบที่ผู้คนอธิบายว่าพวกเขาทำงานบน linux (เช่นเอาท์พุทพา ธ แบบเต็มไปยังลิงก์สัญลักษณ์) พวกเขาเพียงพิมพ์เส้นทางลิงก์สัญลักษณ์สำหรับฉัน:

FantasticMrFox:bin robert$ pwd -P python3
/usr/local/bin
FantasticMrFox:bin robert$ find `pwd -P` -name python3
/usr/local/bin/python3

ความคิดใด ๆ ที่เกิดขึ้นที่นี่?

คำตอบ:


36

ฉันคิดว่าpwd -Pและreadlinkจะเป็นเพื่อนของคุณสำหรับงานนี้

" ฉันจะดูพฤติกรรมของ readlink ของ GNU บน Mac ได้อย่างไร " เป็นทรัพยากรที่มีประโยชน์

pwd -P ใช้งานได้เฉพาะในกรณีที่คุณอยู่ในไดเรกทอรี symlink:

14:07:13 jason@mac ~ $ cd bin
14:08:08 jason@mac bin $ pwd -P
/Users/jason/Applications

readlink ทำงานได้โดยการระบุเป้าหมาย (ดังนั้นจึงสามารถใช้กับไฟล์):

14:09:03 jason@mac ~ $ readlink bin
Applications

14:09:34 jason@mac ~ $ readlink /var
private/var

การส่งออกของreadlinkไว้ดูจะสัมพันธ์กับผู้ปกครองของเป้าหมายที่กำหนดไว้

Ex: ผู้ปกครองของ/varมี/เพื่อให้ถูกต้องเทียบกับprivate/var /ตามตัวอย่างข้างต้นของฉันbin -> Applicationsทั้งสองอยู่ใน Home Directory ของฉันไม่ว่าฉันจะเรียกใช้ที่ไหนผลลัพธ์ก็เหมือนกัน


3
readlink จะไม่หักเงินคืนในกรณีที่ symlink ชี้ไปที่ symlink อื่น ๆ ฉันจะไม่เรียกว่า "การแก้ไขอย่างเต็มที่"
James Roth

นี้จะไม่ปรากฏในการทำงานกับคำถาม OP เกี่ยวกับ symlinks ../..กับสิ่งที่ระบุไว้กับสิ่งที่ชอบ
user124384

18

วิธีนี้จะแก้ไขซ้ำและส่งคืนพา ธ สัมบูรณ์:

$ python
>>> import os
>>> os.path.realpath("/usr/local/bin/python3")

หรือเวอร์ชันที่ไม่ใช่แบบโต้ตอบ:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"

1
เมื่อบิวอินล้มเหลวคุณก็หันไปใช้สคริปต์ ... ดี $ python -c "import os; print os.path.realpath('bin')"แน่นอนการทำงาน:> /Users/jason/Applications> ฉัน symlink ~ / bin to ~ / Applications เพื่อให้มี. bash_profile / $ PATH แบบรวมในระบบ Mac และ * nix
Jason Salaz

1
มันยอดเยี่ยมมากและใช้งานได้ดี! ฉันจะทำเครื่องหมายว่าเป็นคำตอบยกเว้นฉันต้องการทราบว่ามีวิธีการทำเช่นนี้ในเชลล์เช่นเดียวกับที่คุณทำได้บนระบบ * nix อื่น ๆ
Robert S Ciaccio

1
คุณจะทำอย่างไรกับระบบ * nix อื่น ๆ ? นอกจากนี้ Python ยังได้รับการติดตั้งอย่างแพร่หลายในระบบ Linux ในปัจจุบัน
Jason Salaz

@ vxjasonxv สิ่งที่ฉันพบในขณะที่ฉันกำลังยุ่งกับสิ่งนี้แนะนำว่าpwdและfindคำสั่งที่ฉันพูดถึงในคำถามแก้เส้นทางที่สมบูรณ์ในระบบอื่น ๆ นอกเหนือจาก OS X ฉันยังไม่ได้ทดสอบพวกเขา
Robert S Ciaccio


1

GNU coreutils-8.15 เพิ่มในปี 2012 เครื่องมือบรรทัดคำสั่งใหม่realpathที่ทำในสิ่งที่คุณต้องการ: มันแก้ไขกลุ่มของลิงก์สัญลักษณ์และแสดงผลลัพธ์เป็นเส้นทางสัมบูรณ์ (ค่าเริ่มต้น) หรือเส้นทางสัมพัทธ์

แอปเปิ้ลยังไม่รวมrealpathใน MacOS (พวกเขาเศร้าดูเหมือนจะหลีกเลี่ยงเครื่องมือ GPLv3 ทั้งหมด) แต่คุณสามารถติดตั้งได้ด้วยตัวคุณเองเช่นใช้ brew install coreutilsHomebrew:


-2

readlink -fคุณอาจจะใช้ มันเกิดขึ้นอีกครั้งผ่านการเชื่อมโยงทั้งหมด สมมติว่าลิงก์คือพา ธ ที่เป็นลิงก์เพิ่มเติม คุณต้องการมีเส้นทางสัมบูรณ์ขั้นสุดท้าย


ฮะ? คุณว่าอะไรกันแน่
Rob

ไวยากรณ์ที่ถูกต้องสำหรับสิ่งที่ @DINESH SEHRA กำลังพูดคือใช้read link -f python3เป็นตัวอย่างและมันจะบัฟเฟอร์ลิงก์สัญลักษณ์แบบเต็มสำหรับคุณ
Danijel-James W

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