Encuentra todos los archivos ejecutables dentro de una carpeta en la terminal
19
Tengo una carpeta myfolderque contiene una gran jerarquía de archivos / carpetas.
¿Cómo encontrar todos los archivos ejecutables dentro de esta carpeta?
En Ubuntu esto funciona: find . -executable -type f
Pero Mac OS X Mavericks (que también usa bash) no lo consigue:
Esto encontrará todos los archivos (no enlaces simbólicos) con el conjunto de bits ejecutable:
find .-perm +111-type f
Esto también encontrará enlaces simbólicos (que a menudo son igualmente importantes)
find .-perm +111-type f -or-type l
Así es como funciona el comando si no es obvio:
find obviamente es el programa de búsqueda (:
.se refiere al directorio para comenzar a buscar en ( .= directorio actual)
-perm +111= con cualquiera de los bits ejecutables establecidos ( +significa "cualquiera de estos bits", 111es el octal para el bit ejecutable en el propietario, grupo y cualquiera)
-type fsignifica que el tipo es un archivo
-or OR booleano
-type lsignifica que el tipo es un enlace simbólico
Puede usar en -Llugar de -or -type lprovocar que las statllamadas realizadas finddevuelvan las estadísticas del archivo vinculado, no el enlace en sí.
Ian C.
El problema que encontré con este enfoque es que cualquier archivo puede tener el permiso de ejecución. Por ejemplo, después de descargar un archivo de texto de Windows, el permiso está en mal estado.
Ivan Z. Xiao
5
No pude hacer que la respuesta de Ian funcionara (10.6.8), pero lo siguiente dio los resultados esperados:
find .-type f -perm +0111-print
editar actualización
¡Esto parece funcionar también!
find .-type f -perm +ugo+x -print
Supongo que la "x" no tiene sentido sin el usuario / grupo / otros especificadores.
La sintaxis simbólica debe ser nueva, gracias por señalarlo. Actualicé mi respuesta para que use octals y sea compatible con versiones anteriores de OS X.
Ian C.
Por extraño que parezca, esa sección de la página de manual de 10.6 es exactamente la misma que usted citó ... lo cual fue suficiente para hacerme profundizar un poco más y ver qué diablos estaba pasando. Modificó mi respuesta arriba.
Kent
2
Conclusión: la sintaxis del comando BDS es extraña.
-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 trueif at least all of
the bits in the mode are setin 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 trueif 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 tú necesitas:
find .-type f -perm +0111-print
Recuerde que OS X está basado en BSD , no en Linux, por lo que los comandos Gnu a los que está acostumbrado en las distribuciones de Linux (de los cuales findes uno de ellos) no son necesariamente los mismos que en OS X. Esto no es una diferencia de shell, es una diferencia de herramientas de utilidad del sistema operativo / sistema operativo.
Una pregunta muy antigua, lo sé, pero al buscar una solución, es posible que haya encontrado una mejor respuesta.
El principal problema con el uso de "buscar" es que depende de un conjunto de atributos ejecutable, incluso si este atributo está configurado para un archivo no ejecutable.
MacOS viene con una pequeña y práctica herramienta de línea de comandos " file", que muestra información del archivo, 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:Algol68 source text, ASCII text
myProgram:Mach-O 64-bit executable x86_64
Como puede ver, 'MyProgram' es un ejecutable, y muy bien indicado como tal. Dado que los ejecutables antiguos de 32 bits también tendrán la frase "ejecutable", lo siguiente debe enumerar todos los ejecutables verdaderos (binarios):
file *| grep "executable"
Espero que esto también sea útil para alguien que busque una respuesta a la misma pregunta.
Nota: fileno parece tener una función para recurrir a través de subdirectorios.
-L
lugar de-or -type l
provocar que lasstat
llamadas realizadasfind
devuelvan las estadísticas del archivo vinculado, no el enlace en sí.No pude hacer que la respuesta de Ian funcionara (10.6.8), pero lo siguiente dio los resultados esperados:
editar actualización
¡Esto parece funcionar también!
Supongo que la "x" no tiene sentido sin el usuario / grupo / otros especificadores.
fuente
Desde la página del manual para encontrar en OS X :
Así que tú necesitas:
Recuerde que OS X está basado en BSD , no en Linux, por lo que los comandos Gnu a los que está acostumbrado en las distribuciones de Linux (de los 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 herramientas de utilidad del sistema operativo / sistema operativo.fuente
Una pregunta muy antigua, lo sé, pero al buscar una solución, es posible que haya encontrado una mejor respuesta.
El principal problema con el uso de "buscar" es que depende de un conjunto de atributos ejecutable, incluso si este atributo está configurado para un archivo no ejecutable.
MacOS viene con una pequeña y práctica herramienta de línea de comandos "
file
", que muestra información del archivo, por ejemplo:Como puede ver, 'MyProgram' es un ejecutable, y muy bien indicado como tal. Dado que los ejecutables antiguos de 32 bits también tendrán la frase "ejecutable", lo siguiente debe enumerar todos los ejecutables verdaderos (binarios):
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 recurrir a través de subdirectorios.fuente