27 votos

Buscar todos los archivos ejecutables de una carpeta en el terminal

Tengo una carpeta myfolder que contiene una enorme jerarquía de archivos/carpetas.
¿Cómo encontrar todos los archivos ejecutables dentro de esta carpeta?

En Ubuntu funciona: find . -executable -type f

Pero Mac OS X Mavericks (que también utiliza bash ) no lo consigue:

find: -executable: unknown primary or operator

39voto

Shuft Puntos 420

Esto encontrará todos los archivos (no enlaces simbólicos) con el bit ejecutable activado:

find . -perm +111 -type f

De este modo también encontrar enlaces simbólicos (que suelen ser igual de importantes)

find . -perm +111 -type f -or -type l

Así es como funciona el comando si no es obvio:

  • find es obviamente el programa de búsqueda (:
  • . hace referencia al directorio en el que empezar a buscar ( . = directorio actual)
  • -perm +111 = con cualquiera de los bits ejecutables activados ( + significa "cualquiera de estos bits", 111 es el octal para el bit ejecutable en propietario, grupo y cualquiera)
  • -type f significa que el tipo es un archivo
  • -or booleano OR
  • -type l significa que el tipo es un enlace simbólico

2 votos

Puede utilizar -L en lugar de -or -type l para causar cualquier stat llamadas realizadas por find para devolver las estadísticas del archivo enlazado, no el propio enlace.

1 votos

El problema que encontré con este enfoque es que cualquier archivo puede tener el permiso de ejecución. Por ejemplo, después de descargar algún archivo de texto de Windows, el permiso se desordena.

5voto

Kent Puntos 3462

No pude hacer funcionar la respuesta de Ian (10.6.8), pero lo siguiente dio los resultados esperados:

find . -type f -perm +0111 -print

editar actualización

Esto también parece funcionar.

find . -type f -perm +ugo+x -print

Supongo que la "x" no tiene sentido sin los especificadores usuario/grupo/otros.

0 votos

La sintaxis simbólica debe ser nueva, gracias por señalarlo. He actualizado mi respuesta para que utilice octales y sea compatible con sistemas operativos más antiguos.

2 votos

Conclusión: La sintaxis del comando BDS es extraña.

4voto

shsteimer Puntos 8749

En la página man de find en OS X :

 -perm [-|+]mode
         The mode may be either symbolic (see chmod(1)) or an octal number.  If the mode is symbolic, a
         starting value of zero is assumed and the mode sets or clears permissions without regard to the
         process' file mode creation mask.  If the mode is octal, only bits 07777 (S_ISUID | S_ISGID |
         S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file's mode bits participate in the comparison.
         If the mode is preceded by a dash (``-''), this primary evaluates to true if at least all of
         the bits in the mode are set in the file's mode bits.  If the mode is preceded by a plus
         (``+''), this primary evaluates to true if any of the bits in the mode are set in the file's
         mode bits.  Otherwise, this primary evaluates to true if the bits in the mode exactly match the
         file's mode bits.  Note, the first character of a symbolic mode may not be a dash (``-'').

Así que lo necesitas:

find . -type f -perm +0111 -print

Recuerda que OS X es Basado en BSD no está basado en Linux, por lo que los comandos Gnu a los que está acostumbrado en las distribuciones Linux (de las cuales find es uno de ellos) no son necesariamente los mismos que en OS X. Esto no es una diferencia de shell, es una diferencia de sistema operativo/herramientas de utilidad del sistema operativo.

3voto

lime-like Puntos 96

Una pregunta muy antigua, soy consciente, pero buscando una solución puede que haya encontrado una respuesta mejor.

El principal problema de usar "find" es que depende de un atributo establecido como ejecutable, incluso si este atributo está establecido para un archivo no ejecutable.

MacOS incluye una práctica herramienta de línea de comandos " file ", que muestra información sobre los archivos, por ejemplo:

$> file *

Distribution:             directory
SomeFile.icns:            Mac OS X icon, 3272878 bytes, "ic09" type
MyPicture.png:            PNG image data, 1024 x 1024, 8-bit/color RGBA, non-interlaced
NSHelpers.pas:            Algol 68 source text, ASCII text
myProgram:                Mach-O 64-bit executable x86_64

Como puedes ver, 'MiPrograma' es un ejecutable, y está bien indicado como tal. Dado que los viejos ejecutables de 32 bits tendrán la frase "ejecutable" en esto también, lo siguiente debería listar todos los verdaderos ejecutables (binarios):

file * | grep "executable"

Espero que esto también sea útil para alguien que busque una respuesta a la misma pregunta.

Nota: file no parece tener una función para recorrer subdirectorios.

2voto

Danny atGER Puntos 11

Creo que @Hanzaplastique va por buen camino, pero para hacer 'find' correctamente, yo usaría:

find . -type f -exec bash -c "file {} | grep 'executable'" \;

También puede añadir -name "*some_wild_card*" después del . para filtrar por tipo específico de ejecutables. Y, por supuesto, puede sustituir bash con su concha favorita.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X