ฉันไม่เข้าใจสิ่งที่คุณถาม ถ้าฉันไม่รู้อะไรเลยฉันคิดว่าคุณกำลังถามว่ามีวิธีการตรวจจับสิ่งนี้หรือไม่ในขณะที่กำลังจัดการกับไฟล์ ฉันไม่เชื่อว่าเป็นไปได้
วิธีเดียวที่ฉันคิดได้คือทำการค้นหาที่คุณเริ่มมองผ่านสาขาเฉพาะในแผนผังไดเรกทอรี
ตัวอย่าง
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
find
คำสั่งจะตรวจสอบวงนี้ แต่ไม่ได้จริงๆบอกคุณมากทั้งเกี่ยวกับเรื่องนี้
$ find -L . -mindepth 15
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
ผมหยิบพล 15 ระดับเพื่อป้องกันการส่งออกใด ๆ find
จะถูกแสดงโดย อย่างไรก็ตามคุณสามารถปล่อยสวิตช์นั้น ( -mindepth
) หากคุณไม่สนใจเกี่ยวกับแผนผังไดเรกทอรีที่จะแสดง find
คำสั่งยังคงตรวจพบวงและหยุด:
$ find -L .
.
./a
./a/b
./a/b/c
./a/b/c/d
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
อนึ่งหากคุณต้องการแทนที่ค่าเริ่มต้นMAXSYMLINKS
ซึ่งเห็นได้ชัดว่า 40 บน Linux (เคอร์เนลรุ่น 3.x ที่ใหม่กว่า) คุณสามารถเห็นคำถาม & คำตอบ U & L นี้: คุณจะเพิ่ม MAXSYMLINKSอย่างไร
การใช้คำสั่ง symlinks
มีเครื่องมือที่ผู้ดูแลไซต์ FTP สามารถใช้เรียกsymlinks
ซึ่งจะช่วยเปิดเผยปัญหาเกี่ยวกับเครื่องมือที่มีความยาวหรือต้นไม้ห้อยต่องแต่งที่เกิดจากลิงก์สัญลักษณ์
ในบางกรณีsymlinks
สามารถใช้เครื่องมือเพื่อลบลิงก์ที่ละเมิดได้เช่นกัน
ตัวอย่าง
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
ไลบรารี glibc
ห้องสมุด glibc ดูเหมือนจะเสนอฟังก์ชั่น C บางอย่างเกี่ยวกับเรื่องนี้ แต่ฉันไม่รู้บทบาทของพวกเขาทั้งหมดหรือวิธีการใช้งานจริง ดังนั้นฉันสามารถชี้ให้พวกคุณเห็นเท่านั้น
หน้าชายคนนั้นแสดงให้เห็นถึงความหมายฟังก์ชั่นสำหรับการทำงานที่เรียกว่าman symlink
symlink()
คำอธิบายเป็นดังนี้:
symlink () สร้างลิงค์สัญลักษณ์ชื่อ newpath ซึ่งมีสตริง oldpath
หนึ่งในข้อผิดพลาดระบุว่าฟังก์ชั่นนี้จะส่งกลับ:
ELOOP พบการเชื่อมโยงสัญลักษณ์มากเกินไปในการแก้ไข newpath
ฉันจะนำคุณไปยังหน้า man man path_resolution
ซึ่งอธิบายว่า Unix กำหนดพา ธ ไปยังรายการต่างๆในดิสก์ได้อย่างไร โดยเฉพาะย่อหน้านี้
If the component is found and is a symbolic link (symlink), we first
resolve this symbolic link (with the current lookup directory as starting
lookup directory). Upon error, that error is returned. If the result is
not a directory, an ENOTDIR error is returned. If the resolution of the
symlink is successful and returns a directory, we set the current lookup
directory to that directory, and go to the next component. Note that the
resolution process here involves recursion. In order to protect the
kernel against stack overflow, and also to protect against denial of
service, there are limits on the maximum recursion depth, and on the maximum
number of symbolic links followed. An ELOOP error is returned when the
maximum is exceeded ("Too many levels of symbolic links").
readlink ...
พูดถึงสถานการณ์ข้างต้นอย่างไร