liệt kê các tệp theo mục tiêu symlink


23

Làm cách nào để tôi có được danh sách các tệp (và sau đó làm một cái gì đó với danh sách đó) bằng cách lọc qua tên mục tiêu liên kết tượng trưng chứ không phải tên liên kết tượng trưng? Ví dụ: từ danh sách sau Tôi chỉ quan tâm đến bốn tệp đầu tiên (mục tiêu chứa bar):

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc

Câu trả lời:


31

Bạn có thể sử dụng find để tìm nạp tất cả các tệp thuộc loại symlink và thêm -ilnametùy chọn để tìm kiếm theo tên của đích liên kết. Điều này hoạt động giống như -inamenhưng đối với tên mục tiêu liên kết thay vì tên liên kết.

find -type l -ilname "*bar*"

Điều đó vẫn sẽ in ra tên của liên kết, không phải mục tiêu. Nếu bạn muốn in tên của các mục tiêu, hãy thử điều này:

find -type l -ilname "*bar*" -printf "%l\n"

Hoặc có được một lsđầu ra kiểu đầy đủ

find -type l -ilname "*bar*" -ls

Ý của bạn là " làm gì đó với danh sách " không rõ ràng, nhưng nếu bạn muốn thao tác trên các tệp liên kết, bạn có thể sử dụng -execđối số để tìm:

find -type l -ilname "*bar*" -exec touch {} \;

Nhưng nếu bạn cần hoạt động trên các mục tiêu liên kết, bạn sẽ cần sử dụng -printfđể lấy các giá trị đích và sau đó xargshoặc một số vòng lặp để tự vận hành. Bạn có thể làm một cái gì đó như thế này:

find -type l -printf "%l\n" | grep bar | xargs touch

... Điều này cũng cho thấy cách sử dụng grepthay vì find -ilnamethực hiện khớp tên của bạn, mặc dù bạn có thể làm theo cách đó.


cảm ơn bạn Bạn đã hoàn toàn trả lời câu hỏi ngay lập tức của tôi cũng như bao gồm một số trường hợp kênh bên mà tôi chắc chắn cũng sẽ sử dụng.
matt wilkie

1
Bất cứ ý tưởng tại sao điều này find /dev/disk/ -type l -ilname "*sde*"không làm việc?
Sức mạnh Bảo Bình

Yêu cầu GNU tìm.
ceving
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.