it-swarm-vi.com

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?

Nếu tôi sử dụng lệnh find 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 kịch bản 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 tin thực thi nhị phân.

48
uray

Bạn có thể thử tiện ích file. 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.

45
Steven D

Đâ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 bằng #!. 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 nhị phân ELF và các chương trình 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

Chỉ trong trường hợp bạn thấy mình trên một hệ thống có downlevel find (vẫn còn, như tôi viết, một cụm khoa học lotta 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, ví dụ:

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.

2
TomRoche