Pregunta

Tengo que escribir un script que encuentre todos los archivos ejecutables en un directorio. Así que intenté varias formas de implementarlo y realmente funcionan. Pero me pregunto si hay una mejor manera de hacerlo.

Entonces este fue mi primer enfoque:

ls -Fla | grep \*$

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

Entonces este fue el segundo enfoque:

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

Esto también funciona bien, quiero un tablero como primer personaje, entonces no estoy interesado en los próximos dos personajes y el cuarto personaje debe ser una x.

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

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

Así que estoy probando el cuarto, séptimo y décimo personaje para ser una x.

Ahora mi verdadera pregunta, ¿hay una mejor solución usando LS y GREP con Regex para decir:

Quiero GRP solo esos archivos, teniendo al menos una x en los diez primeros caracteres de una línea producida por ls -la

¿Fue útil?

Solución

¿Necesitas usar LS? Puedes usar Find para hacer lo mismo:

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

devolverá todos los archivos ejecutables en el directorio actual. Retire el indicador -Maxdepth para atravesar todos los directorios infantiles.

Puede probar esta terribilidad, pero podría coincidir con archivos que contienen cadenas que parecen permisos.

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

Otros consejos

Si absolutamente debe usar LS y GREP, esto funciona:

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

Coincide con las líneas donde la primera palabra (no blancas) contiene al menos una 'x'.

Encontrar es la herramienta perfecta para esto. Esto encuentra todos los archivos (-type f) que son ejecutables:

find . -type f -executable

Si no desea que enumere recursivamente todos los ejecutables, use Maxdepth:

find . -maxdepth 1 -type f -executable

Tal vez con test -x?

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

El en ls omitirá los alias de shell.

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

Esto da caminos absolutos a los ejecutables.

file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top