Câu trả lời:
Không dễ dàng. Bạn có thể dùng
locate bash | while IFS= read -r line; do [[ -x "$line" ]] && echo $line; done
để tìm tất cả các tệp thực thi trong đó tên chứa bash
. Điều này nhanh hơn so với việc sử dụng find
trên toàn bộ hệ thống tệp vì chỉ cần kiểm tra một vài tệp.
locate bash
làm những gì nó luôn luôn làm (liệt kê tất cả các trận đấu)|
(pipe) nhận đầu ra từ lệnh đầu tiên ( locate
) và gửi nó đến lệnh thứ hai (phần còn lại của dòng)while ...; do ... done
vòng lặp trên mỗi dòng mà nó nhận được từ các đường ống (từ locate
)read -r line
đọc một dòng đầu vào và lưu trữ nó trong một biến được gọi line
(trong trường hợp của chúng tôi, tên đường dẫn / tên tệp)[[ -x "$line" ]]
kiểm tra xem tập tin trong $line
có thực thi được không&& echo $line
phần in nó trên màn hình của bạnGiải pháp nhanh nhất và ít tốn kém nhất:
locate -b '\gtags' | xargs -ri find {} -prune -type f -executable
Theo xargs
trang man, cú pháp trên chuyển tất cả tên tệp được tìm thấy locate
cho một lần thực thi find
, chỉ kiểm tra các tệp được chỉ định.
Giải pháp này tốt hơn những giải pháp được đưa ra trước đây bởi vì:
find
để tìm kiếm mọi tệp trên hệ thống bắt đầu bằng thư mục gốc có thể là một lệnh ngắn, nhưng có thể mất nhiều thời gian để chạy.Vì những người khác đã yêu cầu giải thích chi tiết về các tham số được đưa ra trong các câu trả lời trước đó, nên các chi tiết là:
locate
(Xem: Gọi định vị - Tìm tệp )
-b
: Chỉ khớp tên tệp cơ sở của tên đường dẫn với các mẫu đã chỉ định, không xem xét tên của các thư mục trong tên đường dẫn.\
: Vì dấu gạch chéo ngược là một ký tự toàn cục, nó ngăn không cho locate
xử lý mẫu gtags
, như thể nó là như vậy *gtags*
. Tức là, nó tìm kiếm các tệp có tên chính xác "gtags" mà không có các ký tự khác trước hoặc sau.xargs
(Xem: tùy chọn xargs - Tìm tệp )
-r
: Nếu đầu vào tiêu chuẩn hoàn toàn trống, không chạy lệnh.-i
: Thay thế {}
trong lệnh sau với danh sách tên tệp được đọc từ đầu vào tiêu chuẩn.find
(Xem: tìm Chỉ mục chính - Tìm tệp )
{}
: xargs
thay thế tên này bằng tên của tất cả các tệp mà nó nhận được từ locate
đầu vào tiêu chuẩn. find
tìm kiếm tất cả các tệp đó cho khớp với các biểu thức sau và nếu bất kỳ tệp nào trong số chúng là thư mục, nó cũng kiểm tra nội dung của chúng.-prune
: Nếu tên tệp được đánh giá thuộc về một thư mục, đừng tìm kiếm nội dung của nó.-type f
: Chỉ bao gồm trong tên tệp đầu ra thuộc về các tệp "thông thường", không bao gồm các tên đặc biệt như thiết bị, ống có tên, v.v.-executable
: Chỉ bao gồm trong tên tệp đầu ra của các tệp thi hành. Đó là, những người có một hoặc nhiều bit chế độ thực thi của họ được đặt, bất kể nội dung tệp.Nói tóm lại, locate
in tên của các tệp phù hợp với đầu ra tiêu chuẩn, được dẫn (sử dụng |
) vào đầu vào tiêu chuẩn của xargs
. xargs
đọc tên tệp từ đầu vào tiêu chuẩn và kết hợp chúng thành một danh sách được phân tách bằng dấu cách trong một chuỗi. Nếu chuỗi không trống, xargs
thay thế chuỗi cho {}
trong find
lệnh trước khi thực hiện chuỗi .
-L
ngay trước {}
đối số để tìm. Đó là cách bạn có thể tìm thấy, vd gcc
.