Trovare i file eseguibili utilizzando ls e grep
Domanda
Devo scrivere uno script che trova tutti i file eseguibili in una directory. Così ho provato diversi modi per attuarlo e che in realtà funzionano. Ma mi chiedo se c'è un modo migliore per farlo.
Quindi questo è stato il mio primo approccio:
ls -Fla | grep \*$
Questo funziona bene, perché la bandiera -F fa il lavoro per me e aggiunge a ciascun file eseguibile un asterisco, ma diciamo che non mi piace il segno asterisco.
Quindi, questo è stato il secondo approccio:
ls -la | grep -E ^-.{2}x
Questo funziona troppo fine, voglio un trattino come primo carattere, quindi non mi interessa nei prossimi due personaggi e il quarto carattere deve essere una x.
Ma c'è un po 'di ambiguità nei requisiti, perché io non so se devo controllare per l'utente, gruppo o altri permessi di esecuzione. Quindi questo dovrebbe funzionare:
ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x
Così sto testando il quarto, settimo e decimo carattere di essere un x.
Ora la mia vera domanda, c'è una soluzione migliore usando ls e grep con regex dire:
Voglio grep solo i file, avendo almeno una x nei dieci primi caratteri di una linea di prodotti da ls -la
Soluzione
Avete bisogno di usare ls? È possibile utilizzare Trova per fare lo stesso:
find . -maxdepth 1 -perm -111 -type f
restituirà tutti i file eseguibili nella directory corrente. Rimuovere la bandiera -maxdepth di attraversare tutte le directory figlio.
Si potrebbe provare questo terribilità ma potrebbe corrispondere a file che contengono le stringhe che assomigliano permessi.
ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"
Altri suggerimenti
Se è assolutamente necessario utilizzare ls e grep, questo funziona:
ls -Fla | grep '^\S*x\S*'
Si abbina linee in cui la prima parola (senza spazi) contiene almeno un 'x'.
Trova è lo strumento perfetto per questo. Questo trova tutti i file (tipo f) che sono eseguibili:
find . -type f -executable
Se non si desidera che l'elenco in modo ricorsivo tutti gli eseguibili, uso maxdepth:
find . -maxdepth 1 -type f -executable
Forse con la prova -x?
for f in $(\ls) ; do test -x $f && echo $f ; done
Il \ sulla LS alias shell bypass.
for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done
Questo dà percorsi assoluti per gli eseguibili.
file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'