¿Cómo puedo encontrar sólo los archivos ejecutables bajo un cierto directorio en Linux?
¿Cómo puedo encontrar sólo los archivos ejecutables bajo un cierto directorio en Linux?
¿Cómo puedo encontrar sólo los archivos ejecutables bajo un cierto directorio en Linux?
La comprobación de los archivos ejecutables puede hacerse con -perm
(no recomendado) o -executable
(recomendado, ya que tiene en cuenta el ACL). Para usar la opción -executable
:
find <dir> -executable
si quiere encontrar sólo archivos ejecutables y no directorios de búsqueda, combine con -type f
:
find <dir> -executable -type f
Usa la opción de encontrar -perm
. Esto encontrará archivos en el directorio actual que son ejecutables por su dueño, por miembros del grupo o por otros:
find . -perm /u=x,g=x,o=x
Edit:
Acabo de encontrar otra opción que está presente al menos en GNU find 4.4.0:
find . -executable
Esto debería funcionar aún mejor porque también se consideran las ACLs.
Sé que la pregunta menciona específicamente a Linux, pero como es el primer resultado en Google, sólo quería añadir la respuesta que buscaba (por ejemplo si usted está - como yo en este momento - obligado por su empleador a usar un sistema que no sea GNU/Linux).
Probado en macOS 10.12.5
find . -perm +111 -type f
Tengo otro enfoque, en caso de que lo que realmente quieras es hacer algo con los archivos ejecutables, y no necesariamente forzar a encontrar para filtrarse a sí mismo:
for i in `find -type f`; do [-x $i] && echo "$i is executable"; done
Prefiero esto porque no depende de -executable
que es específico de la plataforma; y no depende de -perm
que es un poco arcano, un poco específico de la plataforma, y como está escrito arriba requiere que el archivo sea ejecutable para todos (no sólo para ti). El -type f
es importante porque en los directorios de *nix tiene que ser ejecutable para ser transitable, y cuanto más de la consulta esté en el comando find
, más eficiente será la memoria de su comando.
De todos modos, sólo ofreciendo otro enfoque, ya que *nix es la tierra de los mil millones de enfoques.
Un archivo marcado como ejecutable no tiene que ser un archivo u objeto ejecutable o cargable.
Esto es lo que uso:
find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
case "$(head -n 1 "$1")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*)exit0;;
esac
exit 1
' sh {} \; -print
Como fan de la línea única…
find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
Usando ‘xargs’ para tomar la salida del comando de búsqueda (usando print0 para asegurar que los nombres de archivos con espacios se manejen correctamente). Ahora tenemos una lista de archivos que son ejecutables y los proporcionamos, uno por uno, como parámetro para el comando ‘file’. Luego, busque el término ASCII para ignorar los binarios. Por favor, sustituya -ejecutable en el comando find con el estilo que prefiera (vea las respuestas anteriores) o lo que funciona en su ‘NIX OS
Requerí lo anterior para encontrar los archivos con eval en los scripts propiedad de root, así que creé lo siguiente para ayudar a encontrar las debilidades de escalada de privación donde el usuario root ejecuta scripts con parámetros inseguros…
echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find / -not \( -path /proc -prune \) -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &
He creado una función en ~/.bashrc
esta noche para encontrar archivos ejecutables que no estén en la ruta del sistema y no en los directorios:
# Quickly locate executables not in the path
xlocate () {
locate -0r "$1" | xargs -0 -I{} bash -c '[[-x "$1"]] && [[! -d "$1"]] \
&& echo "executable: $1"' _ {}
} # xlocate ()
La ventaja es que buscará tres distribuciones de Linux y una instalación de Windows en menos de un segundo donde el comando find
tarda 15 minutos.
Por ejemplo:
$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate
real 0m0.504s
user 0m0.487s
sys 0m0.018s
O para un directorio entero y todos sus subs:
$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65
real 0m0.741s
user 0m0.705s
sys 0m0.032s