2011-10-18 11 views
22

Tengo que escribir un script que encuentre todos los archivos ejecutables en un directorio. Así que probé varias formas de implementarlo y realmente funcionan. Pero me pregunto si hay una manera más agradable de hacerlo.Búsqueda de archivos ejecutables usando ls y grep

Así que este fue mi primer acercamiento:

ls -Fla | grep \*$ 

Esto funciona bien, porque la bandera -F hace el trabajo por mí y agrega a cada archivo ejecutable de un asterisco, pero digamos que no me gusta el signo de asterisco.

Así que este fue el segundo enfoque:

ls -la | grep -E ^-.{2}x 

Esto también funciona bien, quiero un guión como primer carácter, entonces no estoy interesado en los siguientes dos caracteres y el cuarto carácter debe ser una x .

Pero hay un poco de ambigüedad en los requisitos, porque no sé si debo verificar el usuario, grupo u otro permiso ejecutable. Así que esto funcionaría:

ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x 

Así que estoy probando que el cuarto, séptimo y décimo carácter es una x.

Ahora mi verdadera pregunta, ¿hay una mejor solución usando ls y grep con expresiones regulares que decir:

Quiero grep sólo los archivos, que tiene por lo menos una x en los diez primeros caracteres de una línea producidos por ls -la

+2

Gracias por encontrar algún tipo de solución antes de pedir ayuda. Dado que tenía el requisito de usar ls y grep, parece una pregunta de tarea y veo a las personas que piden respuestas a la tarea sin ningún intento (o al menos sin una descripción de sus intentos). Sé que es casi 4 años después, pero aun así, buen trabajo. –

Respuesta

37

¿Necesita usar ls? Puede usar find para hacer lo mismo:

find . -maxdepth 1 -perm -111 -type f 

devolverá todos los archivos ejecutables en el directorio actual. Quite el indicador -maxdepth para recorrer todos los directorios secundarios.

Podría intentar este terrible pero podría coincidir con archivos que contienen cadenas que parecen permisos.

ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}" 
+0

sí Tengo que usar ls y grep, pero gracias de todos modos – k13n

35

Si es absolutamente necesario utilizar ls y grep, esto funciona:

ls -Fla | grep '^\S*x\S*' 

que coincide con líneas donde la primera palabra (no está en blanco) contiene al menos una 'x'.

Find es la herramienta perfecta para esto. Esto encuentra todos los archivos (de tipo f) que son ejecutables:

find . -type f -executable 

Si no quiere que la lista recursivamente todos los ejecutables, utilice maxdepth:

find . -maxdepth 1 -type f -executable 
+0

que usted por su respuesta y 'encontrar. -type f -executable' funciona perfectamente. Pero como dije antes, tengo que usar ls y grep. Me pregunto si hay una solución para una expresión regular más inteligente – k13n

+0

¿Alguna razón en particular? bucle a través de ls salida es una mala idea. –

+0

De acuerdo, agregué una expresión regular que hará lo que quiera. – rmmh

7

Tal vez con -x prueba?

for f in $(\ls) ; do test -x $f && echo $f ; done 

El \ en ls pasará por alto los alias de shell.

+1

AFAICS que también enumera directorios. El OP podría ser mejor con ... 'for f in $ (\ ls); do/usr/bin/test -x $ f -a! -d $ f && echo $ f; hecho' –

5
for i in `ls -l | awk '{ if ($1 ~ /x/) {print $NF}}'`; do echo `pwd`/$i; done 

Esto da rutas absolutas a los ejecutables.

-3
file * |grep "ELF 32-bit LSB executable"|awk '{print $1}' 
+0

Esta respuesta apareció en la cola de revisión de baja calidad, presumiblemente porque no proporciona ninguna explicación del código. Si este código responde a la pregunta, considere agregar agregando texto que explique el código en su respuesta. De esta forma, es mucho más probable que obtengas más votos ascendentes y ayudes al indagador a aprender algo nuevo. – lmo

Cuestiones relacionadas