Làm cách nào để chỉ tìm các tệp thực thi bằng cách sử dụng 'định vị'?


8

locate gtagssẽ tìm thấy tất cả các tập tin được đặt tên gtags.

Điều gì sẽ xảy ra nếu tôi chỉ cần thực thi, có cách nào để làm điều này không?


Câu trả lời:


7

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 findtrê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)
  • các while ...; do ... donevò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 $linecó thực thi được không
  • nếu có, && echo $linephần in nó trên màn hình của bạn

Bạn có thể giải thích các thông số chi tiết hơn?
AB

5

Giả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 xargstrang man, cú pháp trên chuyển tất cả tên tệp được tìm thấy locatecho 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ì:

  • Sử dụng 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.
  • Sử dụng shell while-loop để kiểm tra từng tên tệp có thể bị chậm, bởi vì nó kiểm tra từng tệp một lần.

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 locatexử 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 )
    • {}: xargsthay 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. findtì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, locatein 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, xargsthay thế chuỗi cho {}trong findlệnh trước khi thực hiện chuỗi .


Tôi sẽ không loại trừ các liên kết tượng trưng thực thi khớp với tên tệp và thêm -Lngay trước {}đối số để tìm. Đó là cách bạn có thể tìm thấy, vd gcc.
Adam Ryczkowski

2

Câu trả lời ngắn, sử dụng GNU find:

find / -type f -executable -name '*gtags*'
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.