Làm thế nào để tìm tất cả các liên kết mềm (liên kết tượng trưng) trong thư mục hiện tại?


10

Câu hỏi liên quan đến kịch bản shell trong bash.

Làm cách nào để kiểm tra tập lệnh mà tập tin trong thư mục hiện tại là liên kết mềm?

Trong trường hợp tôi đã sử dụng thuật ngữ sai, khi tôi nói các liên kết mềm , tôi đang đề cập đến các tệp được tạo bằng cách sử dụng ln -s.

Điều duy nhất tôi có thể nghĩ ra là đánh giá ls -lanhư một biểu thức và phân tích kết quả của nó, nhưng rõ ràng đây không phải là giải pháp tốt nhất.


1
Chúng được gọi là "liên kết tượng trưng" (trái ngược với "liên kết cứng").
Tạm dừng cho đến khi có thông báo mới.

Đúng rồi, tôi biết có lẽ tôi đã hiểu sai thuật ngữ, cảm ơn vì đã ngẩng cao đầu
bguiz

Liên kết mềm là tốt là tốt, nhưng với một không gian. :-) ( vi.wikipedia.org/wiki/Symbolic_link )
Arjan

Câu trả lời:



14

Bạn có thể không thực sự cần một kịch bản. Để hiển thị bất kỳ liên kết tượng trưng nào trong thư mục hiện tại, mà không cần đệ quy vào bất kỳ thư mục con nào:

tìm thấy . -maxdepth 1 -type l -print

Hoặc, để có thêm thông tin, hãy sử dụng một trong:

tìm thấy . -maxdepth 1 -type l -exec ls -ld {} +
tìm thấy . -maxdepth 1 -type l -print0 | xargs -0 ls -ld

Để nói nếu một tập tin là một liên kết tượng trưng, người ta có thể sử dụng readlink, mà ý chí đầu ra không có gì nếu nó không phải là một liên kết tượng trưng. Ví dụ sau không hoàn toàn hữu ích, nhưng cho thấy cách readlinkbỏ qua các tệp và thư mục bình thường. Sử dụng một trong:

tìm thấy . -maxdepth 1 -exec readlink {} +
tìm thấy . -max ngày 1 -print0 | xargs -0 đường dẫn

Lưu ý rằng ở trên -exec ... +xargs ...nhanh hơn nhiều -exec ... \;. Giống:

thời gian tìm / usr / bin -maxdepth 1 -type l -exec ls -ld {} \;
số 0m0.372 thực
người dùng 0m0.087
sys 0m0.163s

thời gian tìm / usr / bin -maxdepth 1 -type l -exec ls -ld {} +
số 0m0.013 thực
người dùng 0m0.004s
sys 0m0.008s

thời gian tìm / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
số 0m0.012 thật
người dùng 0m0.004s
sys 0m0.009s

Tôi thích câu trả lời của Ba Lan tốt hơn, vẫn là +1 cho bạn, vì tôi có thể cần phải thực hiện nó bên ngoài một kịch bản shell một ngày nào đó.
bguiz

1
Bạn không nhất thiết cần xargs. Bạn chỉ có thể sử dụng tìm. -maxdepth 1 -exec readlink {} \;
stib

Đúng, @stib, nhưng xargsrất nhiều nhanh hơn trên máy Mac của tôi; xem chỉnh sửa của tôi. Nhưng tôi đã học được một điều mới ngày hôm nay: cũng có +thay vì \;(Mặc dù một số người cho rằng điều này đã / có vấn đề với grep.)
Arjan
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.