Sugerencia del sombrero para @ gniourf_gniourf por aclarar un error fundamental.
Esta respuesta intenta proporcionar una descripción general de las respuestas existentes y discutir sus sutilezas y méritos relativos , así como proporcionar información de fondo , especialmente con respecto a la portabilidad .
Encontrar archivos ejecutables puede hacer referencia a dos casos de uso distintos :
- centrado en el usuario : encuentra archivos que son ejecutables por el usuario actual .
- centrado en archivos: busque archivos que tengan (uno o más) bits de permisos ejecutables establecidos .
Tenga en cuenta que en cualquier escenario puede tener sentido usarlo enfind -L ...
lugar de solo find ...
para encontrar también enlaces simbólicos a ejecutables .
Tenga en cuenta que el caso más simple centrado en archivos, buscar ejecutables con el bit de permisos ejecutables establecido para TODOS los tres principales de seguridad (usuario, grupo, otro), normalmente , pero no necesariamente, producirá los mismos resultados que el escenario centrado en el usuario, y es importante entender la diferencia.
Centrado en el usuario ( -executable
)
La respuesta aceptada recomienda encomiablemente -executable
, SI GNU find
está disponible.
- GNU
find
viene con la mayoría de las distribuciones de
Linux
- Por el contrario, las plataformas basadas en BSD, incluido macOS, vienen con BSD find, que es menos potente.
- Según lo requiera el escenario,
-executable
solo coincide con los archivos que el usuario actual puede ejecutar (hay casos extremos. [1] ).
La alternativa BSD find
ofrecida por la respuesta aceptada ( -perm +111
) responde a una pregunta diferente , centrada en el archivo (como dice la propia respuesta).
- Usar solo
-perm
para responder la pregunta centrada en el usuario es imposible , porque lo que se necesita es relacionar la identidad del usuario y del grupo del archivo con el usuario actual , mientras -perm
que solo se pueden probar los permisos del archivo .
Usando solo las find
funciones POSIX , la pregunta no se puede responder sin involucrar utilidades externas.
Por lo tanto, lo mejor que se -perm
puede hacer (por sí mismo) es una aproximación de -executable
. Quizás una aproximación más cercana de lo que -perm +111
es-perm -111
, para encontrar archivos que tengan el bit ejecutable configurado para TODOS los principales de seguridad (usuario, grupo, otros); esto me parece el escenario típico del mundo real. Como beneficio adicional, también es compatible con POSIX (utilícelo find -L
para incluir enlaces simbólicos, consulte más abajo para obtener una explicación):
find . -type f -perm -111 # or: find . -type f -perm -a=x
La respuesta de gniourf_gniourf proporciona un verdadero equivalente portátil de-executable
usar-exec test -x {} \;
, aunque a expensas del rendimiento .
La combinación -exec test -x {} \;
con -perm +111
(es decir, archivos con al menos un conjunto de bits ejecutables) puede ayudar al rendimiento ya que exec
no es necesario invocarlo para cada archivo (lo siguiente usa el equivalente compatible con POSIX de BSD find -perm +111
/ GNU find -perm /111
; consulte más adelante para obtener una explicación) :
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
Centrado en archivos ( -perm
)
- Para responder preguntas centradas en archivos , es suficiente usar el
-perm
primario compatible con POSIX (conocido como prueba en la terminología de búsqueda de GNU).
-perm
le permite probar los permisos de cualquier archivo, no solo la ejecución.
- Los permisos se especifican en modo octal o simbólico . Los modos octales son números octales (p. Ej.,
111
), Mientras que los modos simbólicos son cadenas (p a=x
. Ej., ).
- Los modos simbólicos identifican los principales de seguridad como
u
(usuario), g
(grupo) y o
(otro), o a
para referirse a los tres. Los permisos se expresan como x
ejecutables, por ejemplo, y se asignan a los principales que utilizan operadores =
, +
y -
; para una discusión completa, incluidos los modos octales, consulte la especificación POSIX de la chmod
utilidad .
- En el contexto de
find
:
- Prefijar un modo con
-
(por ejemplo, -ug=x
) significa: archivos coincidentes que tienen todos los permisos especificados (pero los archivos coincidentes pueden tener permisos adicionales).
- No tener prefijo (por ejemplo
755
) significa: hacer coincidir archivos que tienen este conjunto completo y exacto de permisos.
- Advertencia : tanto la búsqueda de GNU como la búsqueda de BSD implementan un prefijo adicional no estándar con lógica son-CUALQUIERA-de-los-bits-de-permiso-especificados , pero hágalo con una sintaxis incompatible :
- BSD encontrar:
+
- Búsqueda GNU:
/
[2]
- Por lo tanto, evite estas extensiones, si su código debe ser portátil .
- Los ejemplos siguientes demuestran respuestas portátiles a varias preguntas centradas en archivos.
Ejemplos de comandos centrados en archivos
Nota:
- Los siguientes ejemplos son compatibles con POSIX , lo que significa que deberían funcionar en cualquier implementación compatible con POSIX, incluyendo GNU find y BSD find; específicamente, esto requiere:
- NO usar prefijos de modo no estándar
+
o /
.
- Usando las formas POSIX de los operadores lógicos primarios :
!
para NOT (GNU find y BSD find también permiten -not
); tenga en cuenta que \!
se utiliza en los ejemplos para proteger !
de las expansiones del historial de shell
-a
para AND (GNU find y BSD find también permiten -and
)
-o
para OR (GNU find y BSD find también permiten -or
)
- Los ejemplos utilizan modos simbólicos , porque son más fáciles de leer y recordar.
- Con el prefijo de modo
-
, los operadores =
y +
se pueden usar indistintamente (por ejemplo, -u=x
es equivalente a -u+x
, a menos que lo aplique -x
más adelante, pero no tiene sentido hacerlo).
- Úselo
,
para unir modos parciales; Y la lógica está implícita; por ejemplo, -u=x,g=x
significa que se deben establecer tanto el bit ejecutable del usuario como del grupo.
- Los modos no pueden expresar por sí mismos una coincidencia negativa en el sentido de "coincidencia sólo si este bit NO está establecido"; debe utilizar una separada
-perm
de expresión con el NO primaria, !
.
- Tenga en cuenta que los primarios de find (como
-print
, o -perm
; también conocidos como acciones y pruebas en GNU find) se unen implícitamente con -a
(AND lógico), y que -o
y posiblemente los paréntesis (escapados como \(
y \)
para el shell) son necesarios para implementar la lógica OR.
find -L ...
en lugar de solo find ...
se usa para hacer coincidir enlaces simbólicos con ejecutables
-L
indica a find que evalúe los destinos de los enlaces simbólicos en lugar de los propios enlaces simbólicos; por lo tanto, sin -L
, -type f
ignoraría los enlaces simbólicos por completo.
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance.
find -L . -type f -perm -a=x # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x \! -perm -o=x
[1] Descripción de -executable
desde man find
GNU encontrar 4.4.2:
Coincide con archivos que son ejecutables y directorios que se pueden buscar (en un sentido de resolución de nombre de archivo). Esto tiene en cuenta las listas de control de acceso y otros artefactos de permisos que la prueba -perm ignora. Esta prueba hace uso de la llamada al sistema de acceso (2), por lo que puede ser engañado por servidores NFS que hacen mapeo de UID (o aplastamiento de raíz), ya que muchos sistemas implementan acceso (2) en el kernel del cliente y por lo tanto no pueden hacer uso de la información de mapeo de UID almacenada en el servidor. Debido a que esta prueba se basa únicamente en el resultado de la llamada al sistema de acceso (2), no hay garantía de que un archivo para el que esta prueba tenga éxito pueda realmente ejecutarse.
[2] GNU encuentra versiones anteriores a la 4.5.12 que también permitían el prefijo +
, pero primero se desaprobó y finalmente se eliminó, porque la combinación +
con modos simbólicos produce probablemente resultados inesperados debido a que se interpreta como una máscara de permisos exacta . Si usted (a) se ejecutan en una versión anterior 4.5.12 y (b) se limite a octales modos solamente, usted podría salir con el uso +
de ambas GNU encontrar y BSD hallazgo, pero no es una idea buena.