it-swarm-id.com

Bagaimana menemukan semua executable biner secara rekursif dalam direktori?

Jika saya menggunakan perintah find seperti ini:

find /mydir/mysubdir -executable -type f

semua file yang dapat dieksekusi terdaftar (tidak termasuk direktori), dan termasuk file skrip yang dapat dieksekusi (seperti script.sh, dll). Yang ingin saya lakukan adalah daftar hanya file biner yang dapat dijalankan.

48
uray

Anda dapat mencoba utilitas file. Menurut halaman manual:

Tes ajaib digunakan untuk memeriksa file dengan data dalam format tetap tertentu. Contoh kanonik dari ini adalah file binary executable (compiled program), yang formatnya didefinisikan, dan mungkin dalam direktori include standar.

Anda mungkin harus bermain-main dengan ekspresi reguler tetapi sesuatu seperti:

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

file memiliki banyak opsi, jadi Anda mungkin ingin melihat lebih dekat halaman manual. Saya menggunakan opsi pertama yang saya temukan yang sepertinya menghasilkan keluaran dengan mudah.

45
Steven D

Berikut adalah cara untuk mengecualikan skrip, mis., File yang dua karakter pertamanya adalah #!:

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

Untuk beberapa jenis file, tidak jelas apakah Anda ingin mereka diklasifikasikan sebagai skrip atau biner, misalnya file bytecode. Bergantung pada bagaimana pengaturannya, ini mungkin atau mungkin tidak dimulai dengan #!. Jika ini penting bagi Anda, Anda harus membuat skrip Shell bagian dalam lebih kompleks. Misalnya, berikut ini cara Anda memasukkan program ELF binari dan executable Mono dan program bytecode Objective Caml tetapi bukan jenis executable lainnya seperti skrip Shell atau skrip Perl atau program bytecode 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

Kalau-kalau Anda menemukan diri Anda pada sistem dengan downlevel find (masih ada, seperti yang saya tulis, sebuah cluster sains lotta yang menjalankan RHEL5!) Tanpa hak untuk memperbarui: bukannya

find /mypath/ -executable -type f

dalam jawaban luar biasa di atas, Anda dapat melakukannya, mis.,

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

yang mencari bit izin. Sayangnya di atas hanya menemukan file yang pengguna dapat dieksekusi, tetapi itu biasanya bekerja untuk saya.

2
TomRoche