Làm thế nào để tìm tất cả các tệp thực thi nhị phân đệ quy trong một thư mục?


46

Nếu tôi sử dụng findlệnh như thế này:

find /mydir/mysubdir -executable -type f

tất cả các tệp thực thi được liệt kê (không bao gồm các thư mục) và bao gồm tệp tập lệnh thực thi (như script.sh, v.v.). Những gì tôi muốn làm là chỉ liệt kê các tệp thực thi nhị phân.


1
Vui lòng thay đổi chủ đề để bao gồm từ 'nhị phân', đó là chìa khóa để trả lời câu hỏi của bạn.
Stefan Lasiewski

Câu trả lời:


44

Bạn có thể thử filetiện ích. Theo trang hướng dẫn:

Các bài kiểm tra ma thuật được sử dụng để kiểm tra các tệp có dữ liệu ở các định dạng cố định cụ thể. Ví dụ điển hình của điều này là tệp a.out thực thi nhị phân (chương trình đã biên dịch), có định dạng được định nghĩa và có thể trong thư mục bao gồm tiêu chuẩn.

Bạn có thể phải chơi xung quanh với biểu thức thông thường nhưng đại loại như:

$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'

tập tin có rất nhiều tùy chọn, vì vậy bạn có thể muốn xem xét kỹ hơn về trang man. Tôi đã sử dụng tùy chọn đầu tiên mà tôi thấy rằng dường như đầu ra dễ dàng cho đầu ra grep.


15
Tôi muốn nói sử dụng find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print. Nó sẽ chỉ cung cấp cho bạn các tệp (và do đó có thể được chuyển sang lệnh tiếp theo mà anh ta muốn chạy)
Gert

serverfault.com/a/584595/211551 giải pháp tìm các tệp KHÔNG được đánh dấu thực thi nhưng có thể thực thi được.
dùng2067125

Trên OS X, bạn có thể cài đặt GNU findbằng brew install findutilshoặc sudo port install findutilssau đó bạn có thể chạy một lệnh gọi như thế này để có hiệu quả tương tự:gfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2

7

Đây là một cách để loại trừ các tập lệnh, tức là các tệp có hai ký tự đầu tiên là #!:

find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print

Đối với một số loại tệp, không rõ liệu bạn muốn chúng được phân loại là tập lệnh hay tệp nhị phân, ví dụ như tệp mã byte. Tùy thuộc vào cách mọi thứ được thiết lập, những điều này có thể hoặc không thể bắt đầu với #!. Nếu những vấn đề này với bạn, bạn sẽ phải làm cho tập lệnh shell bên trong phức tạp hơn. Ví dụ: đây là cách bạn có thể bao gồm các tệp nhị phân ELF và các tệp thực thi Mono và các chương trình mã byte khách quan nhưng không phải là các loại thực thi khác như tập lệnh shell hoặc tập lệnh perl hoặc chương trình mã byte JVM:

find -type f -executable -exec sh -c '
    case "$(head -n 1 "$1")" in
       ?ELF*) exit 0;;
       MZ*) exit 0;;
       #!*/ocamlrun*) exit 0;;
    esac
    exit 1
' sh {} \; -print

2

Chỉ trong trường hợp bạn thấy mình đang ở trên một hệ thống với một nền tảng find(vẫn còn, như tôi viết, một cụm khoa học phải chạy RHEL5!) Mà không có quyền cập nhật: thay vì

find /mypath/ -executable -type f

trong các câu trả lời xuất sắc ở trên, bạn có thể làm, vd

find /mypath/h -type f -perm -u+x

tìm kiếm trên các bit cho phép. Thật không may, ở trên chỉ tìm thấy các tập tin mà người dùng có thể thực thi được, nhưng điều đó thường làm việc cho tôi.


Điều này vẫn sẽ tìm thấy các tập lệnh thực thi, không chỉ nhị phân.
Kusalananda
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.