it-swarm-es.com

¿Cómo puedo encontrar solo los archivos ejecutables en un directorio determinado en Linux?

¿Cómo puedo encontrar solo los archivos ejecutables en un directorio determinado en Linux?

145
HaiYuan Zhang

La comprobación de los archivos ejecutables se puede hacer con -perm (no recomendado) o -executable (recomendado, ya que toma en cuenta la ACL). Para usar la opción -executable:

find <dir> -executable

si desea buscar solo archivos ejecutables y no directorios de búsqueda, combínelos con -type f:

find <dir> -executable -type f
148
knittl

Use la opción -perm del hallazgo. Esto encontrará archivos en el directorio actual que pueden ser ejecutados por su propietario, por miembros del grupo o por otros:

find . -perm /u=x,g=x,o=x

Editar:

Acabo de encontrar otra opción que está presente al menos en GNU find 4.4.0:

find . -executable

Esto debería funcionar incluso mejor porque también se consideran las ACL.

31
innaM

Sé que la pregunta menciona específicamente a Linux, pero como es el primer resultado en Google, solo quería agregar la respuesta que estaba buscando (por ejemplo, si usted, como yo en este momento, me obliga a usar un GNU/Sistema Linux).

Probado en macOS 10.12.5

find . -perm +111 -type f
12
friederbluemle

Tengo otro enfoque, en caso de que lo que realmente quieres es simplemente hacer algo con archivos ejecutables, y no necesariamente forzar la búsqueda para filtrarse:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

Prefiero esto porque no se basa en -executable que es específico de la plataforma; y no se basa en -perm que es un poco arcano, un poco específico de la plataforma, y ​​como está escrito anteriormente requiere que el archivo sea ejecutable para todos (no solo para usted).

El -type f es importante porque en * nix los directorios tienen que ser ejecutables para poder ser atravesados, y cuanto mayor sea la consulta en el comando find, más eficiente será su comando en la memoria.

De todos modos, solo ofrezco otro enfoque, ya que * nix es la tierra de mil millones de enfoques.

3
Mark McKenna

Un archivo marcado como ejecutable no necesita ser un archivo u objeto ejecutable o cargable.

Esto es lo que yo 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
2
AjayKumarBasuthkar

Como fan de un forro ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Uso de '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 el parámetro para el comando 'archivo'. Luego, grep para el término ASCII para ignorar los binarios. Por favor, sustituya -executable en el comando de búsqueda con el estilo que prefiera (vea las respuestas anteriores) o lo que funciona en su 'NIX OS

Requerí lo anterior para encontrar archivos con eval en scripts propiedad de root, así que creé lo siguiente para ayudar a encontrar puntos débiles en la escalada de privacidad donde el usuario root ejecuta scripts con parámetros no seguros ...

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 &
1
Richard Braganza

Creé 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 completo y todos sus subs:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real    0m0.741s
user    0m0.705s
sys     0m0.032s
0
WinEunuuchs2Unix