ฉันขอแนะนำอย่างยิ่งว่าไม่ควรใช้find -L
สำหรับงานนี้ (ดูคำอธิบายด้านล่าง) นี่คือวิธีอื่นในการทำสิ่งนี้:
หากคุณต้องการใช้วิธีการ "บริสุทธิ์find
" มันควรจะมีลักษณะเช่นนี้:
find . -xtype l
( xtype
คือการทดสอบที่ดำเนินการเกี่ยวกับการเชื่อมโยง dereferenced) นี้อาจไม่สามารถใช้ได้ในทุกรุ่นของfind
แต่ แต่มีตัวเลือกอื่น ๆ เช่นกัน:
คุณยังสามารถเรียกใช้งานtest -e
จากภายในfind
คำสั่ง:
find . -type l ! -exec test -e {} \; -print
แม้กระทั่งgrep
เคล็ดลับบางอย่างอาจดีกว่า (กล่าวคือปลอดภัยกว่า) find -L
แต่ไม่ตรงตามที่แสดงในคำถาม (ซึ่ง greps ในบรรทัดเอาต์พุตทั้งหมดรวมถึงชื่อไฟล์):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
find -L
เคล็ดลับยกมาโดยเดี่ยวจากcommandlinefuดูดีและ hacky แต่ก็มีหนึ่งมากหลุมพรางอันตราย : symlinks ทั้งหมดมีการปฏิบัติตาม พิจารณาไดเรกทอรีที่มีเนื้อหาที่แสดงด้านล่าง:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
หากคุณทำงานfind -L . -type l
อยู่ในไดเรกทอรีที่ทั้งหมด/usr/share/
จะได้รับการสืบค้นเช่นกัน (และที่สามารถใช้เวลานานจริงๆ) 1 สำหรับfind
คำสั่งที่เป็น "ภูมิคุ้มกันในการเชื่อมโยงออก" -L
ไม่ได้ใช้
1สิ่งนี้อาจดูเหมือนความไม่สะดวกเล็กน้อย (คำสั่งจะ "ใช้" ใช้เวลานานในการสำรวจทั้งหมด/usr/share
) - แต่อาจมีผลกระทบรุนแรงกว่านี้ ตัวอย่างเช่นพิจารณาสภาพแวดล้อม chroot: พวกเขาสามารถมีอยู่ในไดเรกทอรีย่อยของระบบไฟล์หลักและมี symlink ไปยังสถานที่ที่แน่นอน ดูเหมือนว่าลิงก์เหล่านั้นจะใช้งานไม่ได้กับระบบ "ออกไปข้างนอก" เพราะมันจะชี้ไปยังสถานที่ที่เหมาะสมเมื่อคุณเข้าสู่ระบบแล้ว ฉันยังจำได้ว่า bootloader บางอย่างที่ใช้ symlinks ภายใต้ความรู้สึกที่ทำเฉพาะในขั้นตอนการบูตเริ่มต้นเมื่อบูตพาร์ทิชันที่ถูกติดตั้งเป็น/boot
/
ดังนั้นหากคุณใช้find -L
คำสั่งเพื่อค้นหาและลบ symlink ที่เสียหายจากไดเรกทอรีที่ไม่เป็นอันตรายคุณอาจทำลายระบบของคุณ ...
-type l
มีความซ้ำซ้อนเนื่องจาก-xtype l
จะทำหน้าที่เป็น-type l
ลิงก์ที่ไม่ใช่ ดังนั้นfind -xtype l
อาจเป็นสิ่งที่คุณต้องการ ขอบคุณสำหรับวิธีการนี้