บอกว่าฉันตั้งค่าลิงค์สัญลักษณ์:
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
แต่จะเป็นที่ต้องการสำหรับการใช้งานในสคริปต์มากกว่าการแยกreadlinkls
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, หรือ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}"
}
หากคุณไม่สามารถใช้งานได้การ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คุณอาจต้องการที่จะใช้