Tìm tất cả các liên kết tuyệt đối trong một cây thư mục


8

Làm cách nào để tôi (đệ quy) phát hiện tất cả các liên kết tượng trưng trong một thư mục xác định mục tiêu của chúng một cách tuyệt đối trái ngược với một cách tương đối?

Vì các liên kết này rất có khả năng bị phá vỡ khi toàn bộ cây thư mục được di chuyển, tôi muốn có một cách để xác định chúng.

Ngay cả các liên kết tương đối có thể bị phá vỡ nếu cây thư mục bị di chuyển (nếu chúng tình cờ chỉ ra bên ngoài gốc của cây thư mục), nhưng tôi nghĩ rằng điều này được giải quyết trong câu hỏi này .


Câu trả lời:


15

Để tìm liên kết tuyệt đối, bạn có thể sử dụng find's -lnametùy chọn nếu bạn findủng hộ đó (nó có sẵn ít nhất là trong GNU find, trên FreeBSD và MacOS):

find . -type l -lname '/*'

Điều này yêu cầu findin tên của các tệp là các liên kết tượng trưng và có nội dung (mục tiêu) khớp với /*vỏ bọc.

Nói đúng ra, POSIX chỉ định rằng tên đường dẫn tuyệt đối bắt đầu bằng một /hoặc ba hoặc nhiều hơn/ ; để phù hợp với điều đó, bạn có thể sử dụng

find . -lname '/*' ! -lname '//*' -o -lname '///*'

// foo / bar nào khác với / foo / bar? có nhiều chi tiết hơn về điều đó.

(Cảm ơn Sato Katsura vì đã chỉ ra đó -lnamelà đặc thù của GNU, đến fd0 vì đã đề cập rằng nó thực sự cũng có sẵn trên ít nhất FreeBSD và macOS, và Stéphane Chazelas để đưa ra định nghĩa tên đường dẫn tuyệt đối POSIX.)


Tôi đã định đăng: find ./ -t l -exec ls -l {} \;nên là một sự thay thế an toàn. Nó sẽ dễ dàng phân tích đầu ra của nó làm bất cứ điều gì cần thiết.
Centimane


7

Bạn có thể tìm thấy symlinkstiện ích hữu ích:

$ symlinks -r .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas

Và có thể sửa các liên kết cho bạn. Ở đây với -tđể nói những gì nó sẽ làm:

$ symlinks -rct .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas
changed:  /home/chazelas/test/chazelas -> ../../chazelas
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.