Làm cách nào để tìm tất cả các liên kết tượng trưng trong cây thư mục?


254

Tôi đang cố gắng tìm tất cả các liên kết tượng trưng trong cây thư mục cho trang web của mình. Tôi biết rằng tôi có thể sử dụng findđể làm điều này nhưng tôi không thể tìm ra cách kiểm tra đệ quy các thư mục.

Tôi đã thử lệnh này:

find /var/www/ -type l

Sau đó tôi đã phát hiện ra rằng nội dung trong đó /var/wwwlà các liên kết tượng trưng, ​​vì vậy tôi đã thay đổi lệnh thành:

find -L /var/www/ -type l

phải mất một lúc để chạy, tuy nhiên tôi không nhận được trận đấu nào.

Làm thế nào để tôi có được điều này để kiểm tra thư mục con?

Câu trả lời:


300

Điều này sẽ đệ quy qua /path/to/folderthư mục và chỉ liệt kê các liên kết tượng trưng:

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

Nếu ý định của bạn là theo các liên kết tượng trưng quá, bạn nên sử dụng findlệnh của mình nhưng bạn nên bao gồm -Ltùy chọn; Trong thực tế, findtrang người đàn ông nói:

   -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.

Sau đó thử điều này:

find -L /var/www/ -type l

Điều này có thể sẽ hoạt động: Tôi tìm thấy trong findtrang nam kim cương này: nếu bạn đang sử dụng -typetùy chọn, bạn phải thay đổi nó thành -xtypetùy chọn:

          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.

Sau đó:

find -L /var/www/ -xtype l

1
Cảm ơn, điều này có thể sẽ hoạt động tuy nhiên tôi chỉ nhận thấy rằng nội dung của / var / www / đã là các liên kết tượng trưng và điều này dường như không tái diễn trong các thư mục đó.
hafichuk

4
@hafichuk xem chỉnh sửa cuối cùng trong câu trả lời của tôi ( find -L /var/www/ -xtype l). Sử dụng -xtypethay vì -typenên thực hiện các mẹo trong tìm kiếm của bạn. Chúc may mắn!
ztank1013

3
Thực hiện điều đó ls -laR /path/to/folder | grep ^lnếu bạn cũng muốn xử lý các thư mục dấu chấm "ẩn" ...
wimvds

2
Cảm ơn bạn! Nhưng điều này chỉ hiển thị tên của các liên kết chứ không phải vị trí của họ.
Kostanos

8
trong Mac OSX (10.9), -xtypekhông khả dụng. find . -type ldường như đang kiểm tra đệ quy.
amertkara

227

Một lệnh, không có đường ống

find . -type l -ls

Giải thích: find từ thư mục hiện tại .trở đi tất cả các tài liệu tham khảo về -type lmực và liệt kê -lschi tiết. Đơn giản và đơn giản ...

Mở rộng dựa trên câu trả lời này, đây là một vài findlệnh liên quan mang tính biểu tượng hơn :

Tìm các liên kết tượng trưng đến một mục tiêu cụ thể

find . -lname link_target

Lưu ý rằng đó link_targetlà một mẫu có thể chứa các ký tự đại diện.

Tìm liên kết tượng trưng bị hỏng

find -L . -type l -ls

Các -Ltùy chọn chỉ thị findtheo các liên kết tượng trưng, trừ khi bị phá vỡ.

Tìm và thay thế các liên kết tượng trưng bị hỏng

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

Thêm ví dụ tìm

Nhiều findví dụ có thể được tìm thấy ở đây: https://hamwaves.com/find/


7
Nếu bạn đang muốn trở nên cô đọng hơn, có thể đáng nói là hầu hết các phiên bản findđều có -lstùy chọn. Vì vậy, find . -type l -lsnên tương đương với ở trên.
Bratchley

7
Điều này cải thiện câu trả lời được chấp nhận vì nó cũng cho bạn biết các liên kết tượng trưng ở đâu trong cây thư mục, đặc biệt quan trọng khi làm việc với loại cây phức tạp và sâu như có khả năng có liên kết tượng trưng.
Jesse Crossen

2
Tốt hơn là câu hỏi được chấp nhận như một câu trả lời tốt hơn.
Lord_Dracon

3
Câu trả lời này hữu ích hơn nhiều so với câu trả lời được chấp nhận. Ngoài ra, nếu bạn muốn tìm các liên kết tượng trưng trỏ đến các tệp trong một số thư mục : find -lname '*/dir/*' -printf '%P -> %l\n'. Điều đáng nói là link_target là một mẫu.
x-yuri

1
Đây là loại câu trả lời của tôi. Đơn giản và đơn giản. Cảm ơn.
Truthadjustr

11

find đã có vẻ đệ quy theo mặc định:

[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]$ 

Đây có lẽ là một trong những gotcha, tất cả các tệp trong / var / www đều là liên kết tượng trưng. Có findmặc định những người theo mặc định? Tôi đoán là không;)
hafichuk

Ya, có lẽ để tránh vòng lặp.
jman

Tôi đã cập nhật để sử dụng -Lcờ để tìm mà không gặp may mắn - có dự đoán nào không?
hafichuk

Giải pháp hoàn hảo, và nó cho thấy vị trí của các liên kết. Cảm ơn bạn!
Kostanos

8

Để chỉ xem các liên kết tượng trưng, ​​bạn có thể sử dụng

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

trong khi nếu bạn muốn xem tập tin nào họ nhắm mục tiêu, chỉ cần thêm một ls

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

6

Đây là điều tốt nhất tôi tìm thấy cho đến nay - hiển thị cho bạn các liên kết tượng trưng trong thư mục hiện tại, theo cách đệ quy, nhưng không theo dõi chúng, được hiển thị với đầy đủ đường dẫn và thông tin khác:

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

kết quả đầu ra trông như thế này:

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

Những gì tôi làm là tạo một tập lệnh trong thư mục bin của tôi giống như một bí danh. Ví dụ tôi có một tập lệnh có tên lsd ls -l | g ^ ^ d

bạn có thể tạo một lsl ls -lR | g ^ ^ l

Chỉ cần chmod họ + x và bạn tốt để đi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.