วิธีดูเส้นทาง symlink แบบเต็ม


128

เมื่อฉันใช้ls -la symlinkNameหรือstat symlinkNameไม่แสดงเส้นทางทั้งหมด (เช่น../../../one/two/file.txt)

คำสั่ง linux ที่เปิดเผยเส้นทางแบบเต็มคืออะไร?


4
ข้อควรระวังที่นี่: เมื่อ ls หรือ stat ไม่แสดงพา ธ สัมบูรณ์ - ลิงค์ไม่มีพา ธ สัมบูรณ์! นี่คือ esp. สำคัญเมื่อติดตั้งอุปกรณ์เช่นในบริบทอื่น (เช่นหากคุณมีบางอย่างในซีดีหรือแท่ง usb หรือพยายามกู้คืน hdd ที่เสีย) โซลูชันที่กล่าวถึงทั้งหมด (realpath, readlink, .... ) แสดงเฉพาะพา ธ สัมบูรณ์ในบริบทที่เมาท์
flolo

คำตอบ:


225

realpathไม่สามารถใช้ได้กับลินุกซ์ทุกรสชาติ แต่readlinkควรจะเป็น

readlink -f symlinkName

ข้างต้นควรทำเคล็ดลับ

หรือหากคุณไม่ได้ติดตั้งอย่างใดอย่างหนึ่งข้างต้นคุณสามารถทำสิ่งต่อไปนี้ได้หากคุณติดตั้ง python 2.6 (หรือใหม่กว่า)

python -c 'import os.path; print(os.path.realpath("symlinkName"))'

16
หากใช้ OSX ให้ละเว้น-fแฟล็กแล้วจะได้ผล คือreadlink symlinkName
Josh Davenport

6
บน OSX การละเว้นแฟ
ล็ก

2
คำถามนี้เกี่ยวกับลินุกซ์เพ็ช
Ian Stapleton Cordasco

27

realpath <path to the symlink file> ควรทำเคล็ดลับ


man realpathแสดงที่ด้านล่างว่าเป็นส่วนหนึ่งของ "GNU coreutils" ซึ่งฉันค่อนข้างมั่นใจว่ามักจะมาใน Ubuntu ดังนั้นแม้ว่า @IanStapletonCordasco จะบอกว่า " realpathไม่สามารถใช้ได้กับลินุกซ์ทุกรสชาติ" แต่อย่างน้อยก็ควรมีในทุกรสชาติ ฉันเชื่อว่ารสชาติอนุพันธ์ของ Ubuntu และ Ubuntu
Gabriel Staples

10

รสชาติยูนิกซ์ -> ll symLinkName

OSX -> readlink symLinkName

ความแตกต่างคือวิธีที่ 1 จะแสดงเส้นทางการเชื่อมโยง sym ในวิธีที่กะพริบและวิธีที่ 2 จะสะท้อนออกมาบนคอนโซล


คำถามถูกถามโดยเฉพาะสำหรับเส้นทางเต็ม / สัมบูรณ์ไม่ใช่เส้นทางสัมพัทธ์ (../../file.txt) ทั้งสองคำตอบนี้จะให้เส้นทางสัมพัทธ์
wisbucky

3

อีกวิธีหนึ่งในการดูข้อมูลคือstatคำสั่งที่จะแสดงข้อมูลเพิ่มเติม คำสั่งstat ~/.sshบนจอแสดงผลเครื่องของฉัน

File: ‘/home/sumon/.ssh’ -> ‘/home/sumon/ssh-keys/.ssh.personal’
  Size: 34          Blocks: 0          IO Block: 4096   symbolic link
Device: 801h/2049d  Inode: 25297409    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/   sumon)   Gid: ( 1000/   sumon)
Access: 2017-09-26 16:41:18.985423932 +0600
Modify: 2017-09-25 15:48:07.880104043 +0600
Change: 2017-09-25 15:48:07.880104043 +0600
 Birth: -

หวังว่านี่อาจช่วยใครบางคนได้


1

คุณสามารถใช้awkกับการsystemโทรreadlinkเพื่อให้เทียบเท่าlsกับเอาต์พุตที่มีเส้นทาง symlink แบบเต็ม ตัวอย่างเช่น:

ls | awk '{printf("%s ->", $1); system("readlink -f " $1)}'

จะแสดงเช่น

thin_repair ->/home/user/workspace/boot/usr/bin/pdata_tools
thin_restore ->/home/user/workspace/boot/usr/bin/pdata_tools
thin_rmap ->/home/user/workspace/boot/usr/bin/pdata_tools
thin_trim ->/home/user/workspace/boot/usr/bin/pdata_tools
touch ->/home/user/workspace/boot/usr/bin/busybox
true ->/home/user/workspace/boot/usr/bin/busybox

ls สามารถทำได้โดยไม่ต้องอ่านลิงก์ เพียงใช้ls -l. สิ่งนี้ยังใช้ไม่ได้เลยพยายามทำทุกอย่างในไดเร็กทอรี (ไม่ใช่ลิงก์) และหาก ls ของคุณถูกกำหนดค่าให้ใช้สี awk จะแตกอย่างสมบูรณ์ เพียงแค่ใช้find . -maxdepth 1 -type l -ls | awk '{print $11 "\t" $12 "\t" $13}'
Hashbrown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.