Encontrar archivos ejecutables usando LS y GREP
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
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}'