ฉันจะค้นหา symlink ทั้งหมดในแผนผังทรีได้อย่างไร


255

ฉันพยายามค้นหา symlink ทั้งหมดภายในแผนผังไดเรกทอรีสำหรับเว็บไซต์ของฉัน ฉันรู้ว่าฉันสามารถใช้findทำสิ่งนี้ แต่ฉันไม่สามารถหาวิธีตรวจสอบไดเรกทอรีซ้ำ ๆ

ฉันได้ลองคำสั่งนี้แล้ว:

find /var/www/ -type l

…และต่อมาฉันค้นพบว่าเนื้อหาใน/var/wwwนั้นเป็น symlink ดังนั้นฉันจึงเปลี่ยนคำสั่งเป็น:

find -L /var/www/ -type l

ต้องใช้เวลาสักพัก แต่ฉันก็ไม่ทัน

ฉันจะรับสิ่งนี้เพื่อตรวจสอบไดเรกทอรีย่อยได้อย่างไร

คำตอบ:


301

สิ่งนี้จะสำรวจ/path/to/folderไดเรกทอรีซ้ำและแสดงเฉพาะลิงก์สัญลักษณ์:

ls -lR /path/to/folder | grep ^l

หากคุณต้องการติดตามลิงก์สัญลักษณ์ด้วยเช่นกันคุณควรใช้findคำสั่งของคุณแต่ควรรวมถึง-Lตัวเลือกด้วย ในความเป็นจริงfindหน้าคนพูดว่า:

   -L     Follow symbolic links.  When find examines or prints information
          about files, the information used shall be taken from the  prop‐
          erties  of  the file to which the link points, not from the link
          itself (unless it is a broken symbolic link or find is unable to
          examine  the file to which the link points).  Use of this option
          implies -noleaf.  If you later use the -P option,  -noleaf  will
          still  be  in  effect.   If -L is in effect and find discovers a
          symbolic link to a subdirectory during its search, the subdirec‐
          tory pointed to by the symbolic link will be searched.

          When the -L option is in effect, the -type predicate will always
          match against the type of the file that a symbolic  link  points
          to rather than the link itself (unless the symbolic link is bro‐
          ken).  Using -L causes the -lname and -ilname predicates  always
          to return false.

จากนั้นลองสิ่งนี้:

find -L /var/www/ -type l

อาจจะใช้งานได้: ฉันพบในfindหน้า man diamond นี้: หากคุณใช้-typeตัวเลือกที่คุณต้องเปลี่ยนเป็น-xtypeตัวเลือก:

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

แล้ว:

find -L /var/www/ -xtype l

1
ขอบคุณนี้อาจใช้งานได้ แต่ฉันเพิ่งสังเกตเห็นว่าเนื้อหาของ / var / www / นั้นเชื่อมโยงกันอยู่แล้วและดูเหมือนว่าจะไม่ได้รับการชดเชยในไดเรกทอรีเหล่านั้น
hafichuk

4
@hafichuk ดูการแก้ไขครั้งสุดท้ายในคำตอบของฉัน ( find -L /var/www/ -xtype l) ใช้-xtypeแทน-typeควรทำเคล็ดลับในการค้นหาของคุณ โชคดี!
ztank1013

3
ทำให้ls -laR /path/to/folder | grep ^lถ้าคุณยังต้องการที่จะดำเนินการ "ซ่อน" ดอทโฟลเดอร์ ...
wimvds

2
ขอบคุณ! แต่นี่จะแสดงชื่อของลิงก์เท่านั้น แต่ไม่ใช่ตำแหน่งของลิงก์
Kostanos

8
ใน Mac OSX (10.9) -xtypeไม่สามารถใช้ได้ find . -type lดูเหมือนว่าจะตรวจสอบซ้ำ
amertkara

227

คำสั่งเดียวไม่มีท่อ

find . -type l -ls

คำอธิบาย: findจากไดเรกทอรีปัจจุบัน.เป็นต้นไปการอ้างอิงทั้งหมดของ-type lหมึกและรายการ-lsเหล่านั้นในรายละเอียด เรียบง่าย...

ขยายคำตอบนี้ต่อไปนี้เป็นfindคำสั่งเกี่ยวกับสัญลักษณ์เพิ่มเติมที่เกี่ยวข้อง:

ค้นหาลิงก์สัญลักษณ์ไปยังเป้าหมายที่ต้องการ

find . -lname link_target

โปรดทราบว่าlink_targetเป็นรูปแบบที่อาจมีอักขระตัวแทน

ค้นหาลิงก์สัญลักษณ์ที่ใช้งานไม่ได้

find -L . -type l -ls

-Lตัวเลือกแนะfindในการปฏิบัติตามการเชื่อมโยงสัญลักษณ์เว้นแต่เมื่อเสีย

ค้นหาและแทนที่ลิงค์สัญลักษณ์ที่ใช้งานไม่ได้

find -L . -type l -delete -exec ln -s new_target {} \;

ค้นหาตัวอย่างเพิ่มเติม

findตัวอย่างเพิ่มเติมสามารถดูได้ที่นี่: https://hamwaves.com/find/


7
หากคุณกำลังมองหาการกระชับยิ่งขึ้นอาจคุ้มค่าที่จะกล่าวถึงว่ารุ่นส่วนใหญ่findมี-lsตัวเลือก ดังนั้นfind . -type l -lsควรเทียบเท่ากับข้างต้น
Bratchley

7
สิ่งนี้จะปรับปรุงในคำตอบที่ได้รับการยอมรับเพราะมันจะบอกคุณว่า symlink อยู่ในไดเรกทอรีต้นไม้โดยเฉพาะอย่างยิ่งเมื่อทำงานกับชนิดของต้นไม้ที่ซับซ้อนและลึกเช่นเดียวกับที่มี symlink
Jesse Crossen

2
ดีกว่าว่าคำถามตอบรับเป็นคำตอบที่ดีกว่า
Lord_Dracon

3
คำตอบนี้มีประโยชน์มากกว่าคำตอบที่ยอมรับ นอกจากนี้ถ้าคุณต้องการที่จะหา symlinks find -lname '*/dir/*' -printf '%P -> %l\n'ชี้ไปที่ไฟล์ในไดเรกทอรีบางอย่างที่: เป็นมูลค่าการกล่าวขวัญว่า link_target เป็นรูปแบบ
x-yuri

1
นี่คือคำตอบของฉัน เรียบง่าย. ขอบคุณ
trueadjustr

11

find โดยค่าเริ่มต้นแล้วดูซ้ำ:

[15:21:53 ~]$ mkdir foo
[15:22:28 ~]$ cd foo
[15:22:31 ~/foo]$ mkdir bar
[15:22:35 ~/foo]$ cd bar
[15:22:36 ~/foo/bar]$ ln -s ../foo abc
[15:22:40 ~/foo/bar]$ cd ..
[15:22:47 ~/foo]$ ln -s foo abc
[15:22:52 ~/foo]$ find ./ -type l
.//abc
.//bar/abc
[15:22:57 ~/foo]$ 

นี่อาจเป็นหนึ่งใน gotcha เหล่านั้นไฟล์ทั้งหมดใน / var / www เป็น symlink ไม่findrecurse เหล่านั้นโดยเริ่มต้นได้อย่างไร ฉันคาดเดาไม่ได้)
hafichuk

ใช่คุณอาจหลีกเลี่ยงการวนซ้ำ
jman

ฉันได้อัปเดตให้ใช้การ-Lตั้งค่าสถานะเพื่อค้นหาโดยไม่มีโชค - เดาใด ๆ ?
hafichuk

โซลูชั่นที่สมบูรณ์แบบและมันแสดงตำแหน่งของลิงก์ ขอบคุณ!
Kostanos

8

หากต้องการดูเฉพาะ symlink คุณสามารถใช้

find -L /path/to/dir/ -xtype l 

ในขณะที่ถ้าคุณต้องการที่จะเห็นไฟล์ที่พวกเขากำหนดเป้าหมายเพียงแค่ผนวก ls

find -L /path/to/dir/ -xtype l -exec ls -al {} \;

6

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

find ./ -type l -print0 | xargs -0 ls -plah

ผลลัพธ์มีลักษณะดังนี้:

lrwxrwxrwx 1 apache develop 99 Dec  5 12:49 ./dir/dir2/symlink1 -> /dir3/symlinkTarget
lrwxrwxrwx 1 apache develop 81 Jan 10 14:02 ./dir1/dir2/dir4/symlink2 -> /dir5/whatever/symlink2Target
etc...

0

สิ่งที่ฉันทำคือสร้างสคริปต์ในไดเรกทอรี bin ของฉันที่เป็นเหมือนนามแฝง ตัวอย่างเช่นฉันมีสคริปต์ชื่อ lsd ls -l | grep ^ d

คุณสามารถสร้างหนึ่ง lsl ls -lR | grep ^ l

เพียงแค่เปลี่ยนพวกเขา + x และคุณก็พร้อมที่จะไป

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