2015-05-28 25 views
6

Utilizzando un ls –a e grep, come si elencerebbe il nome di tutti i file in/usr iniziando con la lettera p o la lettera r o la lettera s utilizzando un unico comando grep?Uso dei comandi grep e ls -a

sarebbe giusto?

ls –a | grep [prs] /usr 
+0

Direttamente in "/ usr" oa qualsiasi livello in "/ usr'? –

+0

direttamente sotto/usr –

+0

'echo/usr/[prs] *' ... – twalberg

risposta

4

Se si sta cercando di trovare i file, non utilizzare ls. Utilizzare il comando find.

find /usr -name '[prs]*' 

Se non si desidera eseguire la ricerca l'intero albero sotto/usr, fare questo:

find /usr -maxdepth 1 -name '[prs]*' 
+0

Elencherà i file, non trovandoli (temo che si tratti di una domanda a casa). – Kusalananda

0

avrei ls la directory e solo allora applicare la grep. Inoltre, vi state perdendo il carattere ^ per filtrare solo i file che iniziano con quelle lettere:

$ ls -a /usr | grep ^[prs] 
+0

grazie mille per l'intuizione! –

0

non Perché solo

find /usr -type f -name '[prs]*' 
+1

Perché ciò dovrebbe attraversare tutto in '/ usr' e non solo'/usr' stesso. – Kusalananda

+0

Questo è facile risolto con un argomento '-maxdepth'. È certamente molto più sicuro che analizzare "ls". –

3
ls -a /usr | grep '^[prs]' 

Sarebbe scegliere tra l'uscita di ls -a /usr (che è l'elenco di file in /usr delimitato da caratteri di nuova riga) le righe che iniziano con uno dei valori p, r o s caratteri.

Questo è probabilmente ciò che il tuo insegnante si aspetta, ma è sbagliato o almeno non affidabile.

I nomi di file possono essere costituiti da molte righe poiché il carattere di nuova riga è un carattere valido come qualsiasi in un nome file su Linux o qualsiasi unix. In questo modo il comando non restituisce i file il cui nome inizia con p, q o s, ma le righe dei nomi di file che iniziano con p, q o s. Generalmente, non è possibile post-processare in modo affidabile l'output di ls.

-a include file nascosti, ovvero file il cui nome inizia con .. Dal momento che si desidera solo quelli che iniziano con p, q o s, è ridondante.

Nota che:

ls /usr | grep ^[pqs] 

sarebbe ancora più sbagliato. Il primo ^ è un carattere speciale in alcune shell come la shell Bourne, rc, es o zsh -o extendedglob (sebbene sia OK in bash o in altre shell POSIX).

Quindi, nella maggior parte dei casi (fish è un'eccezione degna di nota), [pqs] è un operatore in agguato. Ciò significa che lo shell ^[qps] deve essere espanso dalla shell all'elenco dei file che corrispondono a quel modello (relativo alla directory corrente).

Quindi, in quei gusci come bash che non trattano ^ specialmente, se c'è un file chiamato ^p nella directory corrente, che diventerà

ls /usr | grep ^p 

Se non ci sono file corrispondente, in csh, tcsh , zsh o bash -O failglob, riceverai un messaggio di errore e il comando verrà annullato. In zsh -o extendedglob, dove ^ è un operatore globbing, ^[pqs] significherebbe qualsiasi file tranne p, q o s.

2

Il commento di @twalberg è perfetto per le opzioni che hai chiesto. L'eco ignora i file nascosti, ma questi verranno filtrati quando si desidera solo i file che iniziano con [prs].
Quando si desidera file nascosti per altri filtri, una soluzione simile sarebbe ls -ad /usr/[prs]*, in cui l'opzione -d elimina l'elenco dei sottodirectory.
Questa soluzione mostrerà anche il percorso completo, che può essere soppresso quando si va prima alla directory. Quando vuoi rimanere nella tua directory corrente, usa una subshell per essa. Io uso & & per saltare la ls quando la directory/usr non esiste.

(cd /usr && ls -ad [prs]*)