Bagaimana menemukan semua file executable biner secara rekursif dalam direktori?

46

Jika saya menggunakan findperintah 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 dieksekusi.

uray
sumber
1
Ubah subjek untuk memasukkan kata 'biner', yang merupakan kunci untuk menjawab pertanyaan Anda.
Stefan Lasiewski

Jawaban:

44

Anda dapat mencoba fileutilitas tersebut. Menurut halaman manual:

Tes ajaib digunakan untuk memeriksa file dengan data dalam format tetap tertentu. Contoh kanonik ini adalah file biner executable (compile program) biner, yang formatnya ditentukan, 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.

Steven D
sumber
15
Saya akan mengatakan gunakan find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print. Ini hanya akan memberi Anda file (dan dengan demikian dapat diteruskan ke perintah berikutnya yang ingin dijalankan)
Gert
solusi serverfault.com/a/584595/211551 menemukan file yang TIDAK ditandai dapat dijalankan tetapi dapat dieksekusi.
user2067125
Pada OS X, Anda dapat menginstal GNU finddengan brew install findutilsatau sudo port install findutilsdan kemudian Anda dapat menjalankan doa seperti ini untuk efek yang serupa:gfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2
7

Berikut adalah cara untuk mengecualikan skrip, yaitu 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. Tergantung pada bagaimana hal-hal diatur, ini mungkin atau mungkin tidak dimulai #!. Jika ini penting bagi Anda, Anda harus membuat skrip shell bagian dalam lebih kompleks. Misalnya, berikut ini cara Anda memasukkan program ELF binari dan Mono executables dan Objective Caml bytecode tetapi tidak 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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

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

find /mypath/ -executable -type f

dalam jawaban yang sangat baik di atas, Anda dapat melakukan, misalnya,

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.

TomRoche
sumber
Ini masih akan menemukan skrip yang dapat dieksekusi, bukan hanya binari.
Kusalananda