ฉันจะค้นหาลิงก์สัญลักษณ์แบบวงกลมได้อย่างไร


12

ฉันกำลังทำงานกับระบบ HP-UX และฉันต้องการค้นหาว่ามีลิงก์สัญลักษณ์แบบวงกลมหรือไม่

จนถึงตอนนี้ฉันกำลังใช้คำสั่ง:

ls -lrt  `find ./ -follow -type l`

แต่มันทำ ls -lrt ในไดเรกทอรีปัจจุบันเท่านั้น

ฉันควรใช้คำสั่งใดเพื่อค้นหาลิงก์สัญลักษณ์แบบวงกลมทั้งหมดในระบบ


1) คุณจะได้รับไดเรกทอรีปัจจุบันเพราะfindคำสั่งอย่างใดอย่างหนึ่งเพียงแค่พิมพ์.หรือไม่พิมพ์อะไร (เพื่อให้คุณเป็นเพียงการทำงานls -lrtหรือls -lrt .) ไม่ทราบว่าพอเกี่ยวกับ HP-UX findจะบอกคุณว่าการแก้ไขปัญหานี้ (บางทีมันอาจจะต้องใช้อย่างชัดเจน-print? ) 2) คุณหมายถึง "Circular" หมายความว่าอย่างไร ./a -> ./bและ./b -> ./a? เกี่ยวกับ/home/foo/a -> /homeอะไร หรือ/home/foo/a -> /home/barและ/home/bar/b -> /home/foo?
DerfK

โดยวงกลมฉันหมายถึงการเชื่อมโยงใด ๆ ที่สามารถสร้างวงดังนั้นทั้งหมดข้างต้น ฉันพยายามพิมพ์ - ตอนนี้
Vladimir

นอกจากนี้ทำไมไม่รวม-followลิงก์จริงบางตัวให้ผลลัพธ์ด้วย
Vladimir

หากไม่มี-followให้findตรวจสอบลิงก์เองไม่ใช่ไฟล์ที่ชี้ไป ดังนั้นfind . -type lพิมพ์สิ่งต่าง ๆ ที่เป็นลิงค์ (เพราะมี-type l) โดยไม่ต้องมองหาสิ่งที่ชี้ไป (ซึ่งอาจเป็นไฟล์หรือไดเรกทอรีหรือลิงค์อื่น ๆ ที่ชี้ไปยังไฟล์หรือไดเรกทอรี)
DerfK

คำตอบ:


18

manpage ของ GNU find บอกว่า POSIX ที่พบทั้งหมดควรจะตรวจจับลูประบบไฟล์และปล่อยข้อความแสดงข้อผิดพลาดในกรณีเหล่านี้และฉันได้ทดสอบแล้ว

find . -follow -printf ""

ใน GNU find ซึ่งสามารถค้นหาลูปของแบบฟอร์ม./a -> ./bและ./b -> ./aพิมพ์ข้อผิดพลาดได้

find: `./a': Too many levels of symbolic links
find: `./b': Too many levels of symbolic links

(สิ่งนี้ทำงานได้เช่นกันa->b->c->a)

ในทำนองเดียวกันลูปของแบบฟอร์ม./foo/x -> ..และ./foo/a -> ./bar+ ./bar/b -> ./fooพิมพ์ข้อผิดพลาด

find: File system loop detected; `./foo/a/b' is part of the same file system loop as `./foo'.
find: File system loop detected; `./bar/b/a' is part of the same file system loop as `./bar'.
find: File system loop detected; `./foo/x' is part of the same file system loop as `.'.

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


นี่หมายความว่าหากมีลูปใด ๆ ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นหรือไม่
Vladimir

ด้วย GNU ค้นหาและ-followใช่
DerfK

ok แต่วิธีการที่ไม่ได้รับการอธิบายว่าเป็นเพียงการlsแทนของการเชื่อมโยงที่เกิดขึ้นจริงเมื่อไม่ได้ใช้-follow?
Vladimir

1
นั่นเป็นวิธีที่เชลล์ทำงาน คุณขอให้มันรันlsคำสั่งโดยใช้เอาต์พุตของfindคำสั่งของคุณ findคำสั่งของคุณไม่ได้พิมพ์อะไรเลยดังนั้นเชลล์ของคุณจะดำเนินการlsโดยไม่มีอะไรซึ่งแสดงรายการไดเรกทอรีปัจจุบัน
DerfK

โซลูชันของ DerfK ยังค้นหาวัฏจักรใน Windows 7 ด้วยการเรียกใช้จากเปลือก cygwin
Don Gateley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.