2011-10-18 19 views
22

Devo scrivere uno script che trovi tutti i file eseguibili in una directory. Così ho provato diversi modi per implementarlo e funzionano davvero. Ma mi chiedo se c'è un modo migliore per farlo.Trovare file eseguibili usando ls e grep

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 di 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é non so se devo controllare per utente, gruppo o altro permesso eseguibile. Quindi funzionerebbe:

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

Quindi sto testando il quarto, il settimo e il decimo carattere come 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 primi dieci caratteri di una linea di prodotti da ls -la

+2

Grazie per aver effettivamente trovato una soluzione prima di chiedere aiuto. Visto che hai avuto l'esigenza di usare ls e grep, sembra una domanda per i compiti a casa e vedo persone che chiedono risposte ai compiti senza alcun tentativo (o almeno nessuna descrizione dei loro tentativi). So che sono trascorsi quasi 4 anni, ma anche così, buon lavoro. –

risposta

37

Hai bisogno di usare ls? È possibile utilizzare find per fare lo stesso:

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

restituirà tutti i file eseguibili nella directory corrente. Rimuovere il flag -maxdthth per attraversare tutte le directory figlio.

Si può provare questo aspetto, ma potrebbe corrispondere a file contenenti stringhe che sembrano autorizzazioni.

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

sì, devo usare ls e grep, ma grazie comunque – k13n

35

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 alla lista ricorsivamente tutti i file eseguibili, utilizzare maxdepth:

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

Di te per la tua risposta e 'trova. -tipo f -executable' funziona perfettamente. Ma come ho detto prima devo usare ls e grep. Mi chiedo solo se esiste una soluzione per una regex più intelligente – k13n

+0

Qualsiasi motivo particolare? passare attraverso l'output di ls è una cattiva idea. –

+0

Ok, ho aggiunto una regex che farà ciò che vuoi. – rmmh

7

Forse con la prova -x?

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

I \ su ls ignoreranno gli alias di shell.

+1

AFAICS che elenca anche le directory. L'OP potrebbe essere migliore con ... 'per f in $ (\ ls); fai/usr/bin/test -x $ f -a! -d $ f && echo $ f; done' –

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

Questo dà percorsi assoluti per gli eseguibili.

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

Questa risposta si è verificata nella coda di recensioni di bassa qualità, presumibilmente perché non fornisci alcuna spiegazione del codice. Se questo codice risponde alla domanda, considera l'aggiunta aggiungendo del testo che spiega il codice nella tua risposta. In questo modo, è molto più probabile che tu ottenga più upvotes e aiuti l'utente a imparare qualcosa di nuovo. – lmo