ค้นหาเป้าหมายลิงก์สัญลักษณ์ผ่านบรรทัดคำสั่ง


129

บอกว่าฉันตั้งค่าลิงค์สัญลักษณ์:

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

มีวิธีดูว่าเป้าหมายของการmyothertextfile.txtใช้บรรทัดคำสั่งหรือไม่

คำตอบ:


170

ใช้-fแฟล็กเพื่อพิมพ์เวอร์ชันที่เป็นที่ยอมรับ ตัวอย่างเช่น:

readlink -f /root/Public/myothertextfile.txt

จากman readlink:

-f, --canonicalize
      canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist

8
เป็นข้อเสนอแนะในคำถามอื่นreadlink -fคุณอาจต้องการที่จะใช้
Denilson Sá Maia

5
ในการทำให้ Mac OS X ทำงานbrew install coreutilsได้ สิ่งนี้จะติดตั้งคำสั่งเวอร์ชัน gnu พื้นฐานซึ่งนำหน้าด้วยตัวอักษรgเช่นgreadlink -f somefile
Mike D

มีสวิตช์ -f, คำสั่งส่งคืนไม่มีอะไรในกรณีของฉัน ..
sotn

การใช้ -f ให้ข้อมูลที่ฉันต้องการเช่นการแก้ไขหลาย symlink และแสดงเป้าหมายสุดท้าย
isapir

บนUbuntu 18.04.1 LTS (Bionic Beaver)manage ของ readlink มีหมายเหตุว่า "Note realpath (1) เป็นคำสั่งที่ต้องการใช้สำหรับฟังก์ชั่น canonicalization"
Sam Kamensky

23

readlink คือคำสั่งที่คุณต้องการ คุณควรดู man page สำหรับคำสั่ง เพราะถ้าคุณต้องการติดตามลิงก์สัญลักษณ์ไปยังไฟล์จริงคุณต้องใช้สวิตช์ -e หรือ -f:

$ ln -s foooooo zipzip   # fooooo doesn't actually exist
$ ln -s zipzip zapzap

$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo

$ # Follows it, but file not there
$ readlink -e zapzap

$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip

ไม่มีอะไรผิดปกติกับคำตอบแรก แต่คำตอบนี้สมบูรณ์และเป็นประโยชน์มากกว่า
Mike S


4

stat -c%N files*หากคุณต้องการที่จะแสดงต้นทางและปลายทางของการเชื่อมโยงให้ลอง เช่น

$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’

มันไม่ดีสำหรับการแยกวิเคราะห์ (ใช้readlinkเพื่อการนั้น) แต่มันจะแสดงชื่อลิงก์และปลายทางโดยไม่เกะกะls -l

-cสามารถเขียน--formatและ%Nหมายถึง "ชื่อไฟล์ที่ยกมาด้วย dereference หากการเชื่อมโยงสัญลักษณ์"


2

readlinkเป็นสิ่งที่ดี แต่ GNU เฉพาะและไม่ข้ามแพลตฟอร์ม ฉันเคยเขียนสคริปต์ข้ามแพลตฟอร์ม/bin/shดังนั้นฉันจึงใช้สิ่งที่ชอบ:

 ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'

หรือ:

 ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'

แต่สิ่งเหล่านี้จำเป็นต้องได้รับการทดสอบบนแพลตฟอร์มต่าง ๆ ฉันคิดว่ามันจะใช้งานได้ แต่ไม่แน่ใจ 100% สำหรับlsรูปแบบเอาต์พุต

ผลมาจากการlsนอกจากนี้ยังสามารถแยกวิเคราะห์ภายในbashโดยไม่ต้องขึ้นอยู่กับคำสั่งภายนอกเช่นawk, หรือsedperl

bash_realpathฟังก์ชั่นนี้แก้ไขปลายทางสุดท้ายของลิงค์ (ลิงค์→ลิงค์→ลิงค์→สุดท้าย):

bash_realpath() {
  # print the resolved path
  # @params
  # 1: the path to resolve
  # @return
  # >&1: the resolved link path

  local path="${1}"
  while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
  do
    path="${BASH_REMATCH[1]}"
  done
  echo "${path}"
}

1

หากคุณไม่สามารถใช้งานได้การreadlinkแยกวิเคราะห์ผลลัพธ์ls -lสามารถทำได้เช่นนี้

ผลลัพธ์ปกติจะเป็น:

ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan  1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt

ดังนั้นเราจึงต้องการแทนที่ทุกอย่างก่อน "->" และลูกศรรวมอยู่ เราสามารถใช้sedสิ่งนี้:

ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt

1

คำถามนั้นไม่ถูกต้องเพียงพอที่จะให้คำตอบง่ายๆในฐานะหนึ่งในไบรอัน - บราซิล:

readlink -f some_path

จะแน่นอน dereference symlink ที่เกี่ยวข้องทุกคนในเส้นทางสร้างกับเป้าหมายสุดท้ายsome_pathอยู่เบื้องหลัง

แต่ระดับหนึ่งของการเชื่อมโยงแบบเรียงซ้อนเป็นเพียงกรณีหนึ่งของผู้อื่นในระบบกรณีทั่วไปคือระดับ N ของการเชื่อมโยงแบบเรียงซ้อน ดูสิ่งต่อไปนี้ในระบบของฉัน:

$ rwhich emacs
/usr/bin/emacs
 /etc/alternatives/emacs
  /usr/bin/emacs24-x

rwhichเป็นการนำไปใช้ซ้ำของฉันเองwhichซึ่งจะพิมพ์ symlink cascading ระดับกลางทั้งหมด (ไปยัง stderr) ลงไปยังเป้าหมายสุดท้าย (ไปยัง stdout)

ถ้าฉันอยากรู้ว่าอะไรคือ:

  • เป้าหมายของ symlink / usr / bin / emacs ** คำตอบที่ชัดเจนสำหรับฉัน/etc/alternatives/emacsกลับมาโดย:

    readlink $(which emacs)
    readlink /usr/bin/emacs
    
  • สุดท้ายเป้าหมายที่อยู่เบื้องหลัง cascading symlinks / usr / bin / emacs คำตอบจะถูก/usr/bin/emacs24-xส่งกลับโดย:

    readlink -f $(which emacs)
    readlink -f /usr/bin/emacs
    rwhich emacs 2>/dev/null
    

0

llหรือls -lควรแสดงรายการไดเรกทอรีรวมถึงลิงค์สัญลักษณ์ของคุณและเป็นเป้าหมาย

cd -P /root/Public/myothertextfile.txt (ในกรณีของคุณ) ควรชี้ไปที่เส้นทางเดิม


0

หากคุณพบเป้าหมายของลิงก์ทั้งหมดภายในโฟลเดอร์และโฟลเดอร์ย่อยให้ใช้find . -type l -lsคำสั่งที่มีประเภทลิงค์ดังนี้:

me@local.localdomain:~/test$ find . -type l -ls
8601855888        0 lrwxr-xr-x    1 me           staff                   6 Jan 24 19:53 ./link -> target

หากคุณต้องการเป้าหมายเดี่ยวคุณls -lควรทำงาน:

me@local.localdomain:~/test$ ls -l 
total 0
lrwxr-xr-x  1 me  staff  6 Jan 24 19:53 link -> target
-rw-r--r--  1 me  staff  0 Jan 24 19:53 target
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.