Come trovare tutti gli eseguibili binari in modo ricorsivo all'interno di una directory?


46

Se uso il findcomando in questo modo:

find /mydir/mysubdir -executable -type f

vengono elencati tutti i file eseguibili (escluse le directory) e inclusi i file di script eseguibili (come script.sh, ecc.). Quello che voglio fare è elencare solo i file eseguibili binari.


1
Modifica l'oggetto per includere la parola "binario", che è la chiave per rispondere alla tua domanda.
Stefan Lasiewski,

Risposte:


44

Potresti provare l' fileutilità. Secondo la manpage:

I test magici vengono utilizzati per verificare la presenza di file con dati in particolari formati fissi. L'esempio canonico di questo è un file a.out eseguibile binario (programma compilato), il cui formato è definito in, e possibilmente nella directory include standard.

Potrebbe essere necessario giocare con l'espressione regolare ma qualcosa di simile a:

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

il file ha molte opzioni, quindi potresti voler dare un'occhiata più da vicino alla pagina man. Ho usato la prima opzione che ho trovato che sembrava produrre output facilmente grep.


15
Direi uso find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print. Ti darà solo file (e quindi può essere passato al comando successivo che vuole eseguire)
Gert

serverfault.com/a/584595/211551 trova i file NON contrassegnati come eseguibili ma eseguibili.
user2067125

Su OS X, è possibile installare GNU findcon brew install findutilso sudo port install findutilse quindi è possibile eseguire un'invocazione come questo per un effetto simile:gfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2

7

Ecco un modo per escludere gli script, ovvero i file i cui primi due caratteri sono #!:

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

Per alcuni tipi di file, non è chiaro se li desideri classificare come script o binari, ad esempio file bytecode. A seconda di come sono impostate le cose, queste possono o meno iniziare #!. Se questi sono importanti per te, dovrai rendere più complesso lo script della shell interna. Ad esempio, ecco come è possibile includere binari ELF, eseguibili Mono e programmi bytecode Objective Caml ma non altri tipi di eseguibili come script shell o script perl o programmi 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

2

Nel caso in cui ti trovi su un sistema con un livello inferiore find(ci sono ancora, mentre scrivo, un sacco di cluster scientifici che eseguono RHEL5!) Senza i diritti di aggiornamento: invece di

find /mypath/ -executable -type f

nelle risposte eccellenti sopra, puoi fare, ad esempio,

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

che cerca i bit di autorizzazione. Sfortunatamente quanto sopra trova solo i file per cui l'utente ha eseguibile, ma di solito funziona per me.


Ciò troverebbe comunque script eseguibili, non solo binari.
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.