Tôi thực sự khuyên bạn không nên sử dụng find -L
cho nhiệm vụ (xem bên dưới để giải thích). Dưới đây là một số cách khác để làm điều này:
Nếu bạn muốn sử dụng một find
phương thức " thuần túy ", nó sẽ trông giống như thế này:
find . -xtype l
( xtype
là một thử nghiệm được thực hiện trên một liên kết bị loại bỏ) Tuy nhiên, điều này có thể không có sẵn trong tất cả các phiên bản find
. Nhưng cũng có những lựa chọn khác:
Bạn cũng có thể thực thi test -e
từ bên trong find
lệnh:
find . -type l ! -exec test -e {} \; -print
Thậm chí một số grep
mẹo có thể tốt hơn (nghĩa là an toàn hơn ) find -L
, nhưng không chính xác như được trình bày trong câu hỏi (mà greps trong toàn bộ các dòng đầu ra, bao gồm cả tên tệp):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
Thủ find -L
thuật được trích dẫn bởi solo từ Commandlinefu trông rất hay và hack, nhưng nó có một cạm bẫy rất nguy hiểm : Tất cả các liên kết tượng trưng đều được tuân theo. Xem xét thư mục với các nội dung được trình bày dưới đây:
$ 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/
Nếu bạn chạy find -L . -type l
trong thư mục đó, tất cả /usr/share/
cũng sẽ được tìm kiếm (và điều đó có thể mất nhiều thời gian) 1 . Đối với một find
lệnh "miễn dịch với các liên kết đi", không sử dụng-L
.
1 Điều này có thể trông giống như một bất tiện nhỏ (lệnh sẽ "chỉ" mất nhiều thời gian để vượt qua tất cả /usr/share
) - nhưng có thể có hậu quả nghiêm trọng hơn. Ví dụ, hãy xem xét các môi trường chroot: Chúng có thể tồn tại trong một số thư mục con của hệ thống tệp chính và chứa các liên kết tượng trưng đến các vị trí tuyệt đối. Những liên kết đó dường như có thể bị phá vỡ đối với hệ thống "bên ngoài", bởi vì chúng chỉ trỏ đến những nơi thích hợp khi bạn đã vào chroot. Tôi cũng nhớ lại rằng một số bộ nạp khởi động đã sử dụng các liên kết tượng trưng theo /boot
đó chỉ có ý nghĩa trong giai đoạn khởi động ban đầu, khi phân vùng khởi động được gắn kết là /
.
Vì vậy, nếu bạn sử dụng một find -L
lệnh để tìm và sau đó xóa các liên kết tượng trưng bị hỏng khỏi một thư mục trông vô hại, bạn thậm chí có thể phá vỡ hệ thống của mình ...
-type l
là dư thừa vì-xtype l
sẽ hoạt động như-type l
trên không liên kết. Vì vậy,find -xtype l
có lẽ là tất cả những gì bạn cần. Cảm ơn vì cách tiếp cận này.