it-swarm.it

Come trovare tutti gli eseguibili binari ricorsivamente all'interno di una directory?

Se uso il comando find 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.

48
uray

Potresti provare l'utilità file. 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.

45
Steven D

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 non possono iniziare con #!. Se questi sono importanti per te, dovrai rendere più complesso lo script Shell interno. Ad esempio, ecco come potresti includere binari ELF ed 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

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 es.

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.

2
TomRoche