บอกว่าฉันตั้งค่าลิงค์สัญลักษณ์:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
มีวิธีดูว่าเป้าหมายของการmyothertextfile.txt
ใช้บรรทัดคำสั่งหรือไม่
บอกว่าฉันตั้งค่าลิงค์สัญลักษณ์:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
มีวิธีดูว่าเป้าหมายของการmyothertextfile.txt
ใช้บรรทัดคำสั่งหรือไม่
คำตอบ:
ใช้-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
brew install coreutils
ได้ สิ่งนี้จะติดตั้งคำสั่งเวอร์ชัน gnu พื้นฐานซึ่งนำหน้าด้วยตัวอักษรg
เช่นgreadlink -f somefile
Ubuntu 18.04.1 LTS (Bionic Beaver)
manage ของ readlink มีหมายเหตุว่า "Note realpath (1) เป็นคำสั่งที่ต้องการใช้สำหรับฟังก์ชั่น canonicalization"
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
สิ่งนี้จะได้ผล:
ls -l /root/Public/myothertextfile.txt
แต่จะเป็นที่ต้องการสำหรับการใช้งานในสคริปต์มากกว่าการแยกreadlink
ls
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 หากการเชื่อมโยงสัญลักษณ์"
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
, หรือsed
perl
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}"
}
หากคุณไม่สามารถใช้งานได้การ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
คำถามนั้นไม่ถูกต้องเพียงพอที่จะให้คำตอบง่ายๆในฐานะหนึ่งในไบรอัน - บราซิล:
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
ll
หรือls -l
ควรแสดงรายการไดเรกทอรีรวมถึงลิงค์สัญลักษณ์ของคุณและเป็นเป้าหมาย
cd -P /root/Public/myothertextfile.txt
(ในกรณีของคุณ) ควรชี้ไปที่เส้นทางเดิม
หากคุณพบเป้าหมายของลิงก์ทั้งหมดภายในโฟลเดอร์และโฟลเดอร์ย่อยให้ใช้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
readlink -f
คุณอาจต้องการที่จะใช้