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

È stato utile?

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}'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top