Score:0

ฉันจะค้นหา symlink ที่ชี้ไปยัง symlink อื่นได้อย่างไร

ธง ng

ฉันมี symlinks ที่ถูกล่ามโซ่กระจัดกระจายไปทั่ว:

A (symlink) -> B (symlink) -> C (ไฟล์)

บางคนอาจเกี่ยวข้องกับโซ่ยาว ฉันยังไม่แน่ใจ

เมื่อตรวจสอบไฟล์เดียวด้วยตนเอง มันเป็นเรื่องง่ายที่จะเห็นว่าเกิดอะไรขึ้น แต่ฉันกำลังมองหาวิธีอัตโนมัติในการค้นหาสิ่งเหล่านี้และ (ควร) ทำความสะอาด

ในตัวอย่างข้างต้น ฉันต้องการให้ซิมลิงก์ B->C อยู่กับที่ แต่ซิมลิงก์ A->B จะกลายเป็น A->C

ระบุว่าเป็นเป้าหมายหลักหรือไม่ ปริมาณอาจจบลงที่ต่ำพอที่การแก้ไขด้วยตนเองจะไม่ใช่เรื่องใหญ่ แต่การค้นหาทั้งหมดด้วยตนเองนั้นเป็นไปไม่ได้

ฉันรู้จักยูทิลิตี "symlinks" และมีประโยชน์ในหลาย ๆ สถานการณ์ เช่น การค้นหา symlink ที่ห้อยอยู่ แต่ดูเหมือนจะไม่มีความสามารถในการตรวจหา "chains" แบบนี้

ฉันทราบ "find -type l" เช่นเดียวกับ -L ตัวเลือกสำหรับ find แต่ดูเหมือนจะไม่ทำงานร่วมกันเนื่องจาก "find -L -type l" ส่งคืนการตอบกลับที่ว่างเปล่าเสมอ

ฉันใช้ "find -type l -exec ls -l {} +" (ซึ่งทำงานได้ดีกว่าตัวเลือก -ls ของ find) และพยายามใช้เพื่อรับรายการปลายทาง symlink ซึ่งฉันสามารถตรวจสอบเพื่อดูว่าพวกเขา symlinks ใหม่หรือไม่ อย่างไรก็ตาม symlinks ทั้งหมดนั้นสัมพันธ์กันมากกว่าสัมบูรณ์ ดังนั้นเอาต์พุตจึงค่อนข้างยุ่งเหยิง

ตัวอย่างเช่นฉันได้รับผลลัพธ์เช่นนี้:

lrwxrwxrwx 1 username 50 พ.ย. 5 01:00 ./a/b/c/d -> ../../e/f/g/h

จากนั้นฉันต้องคิดสักนิดเพื่อหาว่าปลายทาง symlink จริงคือ ./a/e/f/g/h (จากนั้นฉันสามารถตรวจสอบเพื่อดูว่าเป็น symlink หรือไม่) ไม่เหมาะสำหรับระบบอัตโนมัติ

หาก symlink เป็นแบบสัมบูรณ์ (ชั่วคราว) แทนที่จะเป็นแบบสัมพัทธ์ สิ่งนี้จะง่ายกว่า แต่ยูทิลิตี้ "symlinks" สามารถแปลงค่าสัมบูรณ์ -> ญาติเท่านั้น เท่าที่ฉันสามารถบอกได้ว่าไม่สามารถแปลงความสัมพันธ์ -> สัมบูรณ์ได้

Score:1
ธง nl

ตามห่วงโซ่การเชื่อมโยงทั้งหมด

เส้นทางจริง

เส้นทางจริง(1) ทำให้คุณได้รับปลายทางที่สมบูรณ์ของลิงก์ แต่มันให้คุณเท่านั้น สุดท้าย ปลายทาง ดังนั้นหากคุณมีลิงค์เชน มันจะแสดงเฉพาะพาธของไฟล์/โฟลเดอร์จริงสุดท้ายที่เชนชี้ไปในที่สุด

ดังนั้น ในกรณีของคุณ ถ้า ../../e/f/g/ชม เป็นไฟล์หรือโฟลเดอร์จริง คุณจะเห็นเส้นทางที่แน่นอน แต่ถ้าหนึ่งในส่วนประกอบนั้นเป็น symlink ด้วย มันจะวนซ้ำจนกว่าจะแก้ไข symlink ทั้งหมดที่ขวางทาง

อ่านลิงค์

คุณยังสามารถใช้ อ่านลิงค์(1) คำสั่งด้วยแฟล็ก -f หรือ -e ซึ่งจะให้ผลลัพธ์ที่คล้ายกับ เส้นทางจริง.

  -f, --canonicalize canonicalize โดยทำตามทุก symlink ใน
                                ทุกองค์ประกอบของชื่อที่กำหนดแบบเรียกซ้ำ
                                ทั้งหมดยกเว้นองค์ประกอบสุดท้ายต้องมีอยู่
  -e, --canonicalize-canonicalize ที่มีอยู่โดยทำตามทุก symlink ใน
                                ทุกองค์ประกอบของชื่อที่กำหนดแบบเรียกซ้ำ
                                ต้องมีองค์ประกอบทั้งหมด

หลีกเลี่ยงการติดตามห่วงโซ่การเชื่อมโยงทั้งหมด

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

LINK=./a/b/c/d
/usr/bin/realpath --no-symlinks "$(dirname ${LINK})/$(readlink ${LINK})"

คำอธิบาย:

$ dirname $LINK # dirname ./a/b/c/d
./ก/ข/ค

$readlink $LINK # readlink ./a/b/c/d
../../e/f/g/ชม

$ echo "$(dirname ${LINK})/$(readlink ${LINK})" 
./a/b/c/../../e/f/g/ชม

$ /usr/bin/realpath --no-symlinks "$(dirname ${LINK})/$(readlink ${LINK})"
/home/a/e/f/g/ชม

หากคุณต้องการดูเฉพาะลิงก์ที่เกี่ยวข้องกับ CWD ของคุณ คุณสามารถเพิ่มอาร์กิวเมนต์ --relative-to ได้:

$ /usr/bin/realpath --no-symlinks --relative-to ./ "$(dirname ${LINK})/$(readlink ${LINK})"
ก/จ/ฉ/ก/ชม

ใช้การค้นหา

คุณสามารถรับอาร์กิวเมนต์สำหรับคำสั่ง realpath ที่ฉันเคยแสดงมาก่อนได้โดยใช้คำสั่ง find:

$ ค้นหา ./ -type l -printf "%h/%l\n"
./a/b/c/../../e/f/g/ชม

จากคนพบ:

%h ไดเร็กทอรีนำของชื่อไฟล์ (ทั้งหมดยกเว้นองค์ประกอบสุดท้าย) ถ้า
       ชื่อไฟล์ไม่มีเครื่องหมายทับ (เนื่องจากเป็นไฟล์ปัจจุบัน
       ไดเร็กทอรี) ตัวระบุ %h จะขยายเป็น "."

%l วัตถุของลิงก์สัญลักษณ์ (สตริงว่างหากไฟล์ไม่ใช่ลิงก์สัญลักษณ์)

จากนั้นคุณสามารถรวมกับคำสั่ง realpath จากด้านบน

$ ค้นหา ./ -type l -printf "%h/%l\n" | xargs /usr/bin/realpath -s
/home/a/e/f/g/ชม

หากคุณต้องการดูลิงก์ที่เกี่ยวข้องกับ CWD ของคุณเท่านั้น:

$ ค้นหา ./ -type l -printf "%h/%l\n" | xargs /usr/bin/realpath -s --relative-to ./
ก/จ/ฉ/ก/ชม
Displayname71 avatar
ng flag
น่าสนใจ ... ความจริงที่ว่ามันติดตามห่วงโซ่จนจบนั้นไม่เหมาะ แต่ฉันอาจสามารถอ้างอิงข้ามเอาต์พุตของ realpath ด้วยข้อมูลเป้าหมายบน "ls -l" เพื่อดูว่าตรงกันหรือไม่
aviro avatar
nl flag
ฉันได้แก้ไขคำตอบและเพิ่มตัวเลือกอื่นแล้ว ตัวเลือกสุดท้ายอาจเป็นสิ่งที่คุณต้องการ
aviro avatar
nl flag
@Displayname71 ฉันได้เพิ่มตัวเลือกเพิ่มเติมในคำตอบของฉันแล้ว หวังว่าตัวเลือกใดตัวเลือกหนึ่งจะตรงกับความต้องการของคุณ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา