it-swarm-es.tech

¿Cómo encontrar todos los ejecutables binarios de forma recursiva dentro de un directorio?

Si uso el comando find así:

find /mydir/mysubdir -executable -type f

todos los archivos ejecutables se enumeran (excluyendo directorios), e incluyendo el archivo de script ejecutable (como script.sh, etc.). Lo que quiero hacer es enumerar solo archivos ejecutables binarios.

48
uray

Puede probar la utilidad file. Según la página del manual:

Las pruebas mágicas se utilizan para verificar archivos con datos en formatos fijos particulares. El ejemplo canónico de esto es un archivo binario ejecutable (programa compilado) a.out, cuyo formato está definido y posiblemente en el directorio de inclusión estándar.

Puede que tenga que jugar con la expresión regular pero algo así como:

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

el archivo tiene muchas opciones, por lo que es posible que desee echar un vistazo más de cerca a la página del manual. Utilicé la primera opción que encontré que parecía dar salida fácilmente a grep.

45
Steven D

Aquí hay una manera de excluir scripts, es decir, archivos cuyos primeros dos caracteres son #!:

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

Para algunos tipos de archivos, no está claro si desea clasificarlos como scripts o binarios, por ejemplo, archivos de código de bytes. Dependiendo de cómo estén configuradas las cosas, estas pueden o no comenzar con #!. Si esto te importa, tendrás que hacer que el script de Shell interno sea más complejo. Por ejemplo, así es como puede incluir binarios ELF y ejecutables Mono y programas de código de bytes de Objective Caml, pero no otros tipos de ejecutables como scripts de Shell o scripts de Perl o programas de bytecode de 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

En caso de que te encuentres en un sistema con un nivel inferior find (todavía, como escribo, ¡hay muchos grupos de ciencia que ejecutan RHEL5!) Sin los derechos para actualizar: en lugar de

find /mypath/ -executable -type f

en las excelentes respuestas anteriores, puede hacer, por ejemplo,

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

que busca en bits de permiso. Desafortunadamente, lo anterior solo encuentra archivos para los que el usuario tiene ejecutables, pero eso generalmente funciona para mí.

2
TomRoche