2009-09-10 11:56:56 +0000 2009-09-10 11:56:56 +0000
170
170

¿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?

Respuestas (7)

170
170
170
2009-09-10 11:59:26 +0000

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
35
35
35
2009-09-10 15:55:13 +0000

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.

16
16
16
2017-06-01 06:59:33 +0000

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
3
3
3
2016-04-24 02:38:26 +0000

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.

2
2
2
2014-03-26 07:52:24 +0000

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
1
1
1
2017-07-09 12:31:14 +0000

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 &
0
0
0
2019-06-06 00:08:27 +0000

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