2011-06-14 7 views
7

Sto cercando di capire come ottenere un elenco di nomi di file per un file chiamato BOZO ma che termina con SOLO 123 O 456.Elenca solo determinati file in una directory che corrisponde alla parola BOZO e termina con '123' o '456'

file sono:

BOZO12389,
BOZOand3
BOZOand456
BOZOand5
BOZOhello123

Quindi il comando solo si dovrebbe visualizza "BOZOhello123" e "BOZOand456"

Non riesco a capirlo. Ho provato tutte le forme di LS e GREP a cui riesco a pensare. La cosa divertente è che abbiamo provato a farlo in classe per circa 10 minuti e nessuno è riuscito a ottenerlo (incluso l'istruttore).

+1

Non posso credere che l'istruttore non sarebbe in grado di risolvere questo per così tanto tempo. –

+0

Grazie ragazzi! Non ci abbiamo dedicato molto tempo, ma per qualche ragione ho immediatamente pensato 'grep' e tutti gli altri stavano cercando di farlo con 'ls'. Pertanto, era la prima domanda sui compiti per quella notte. – Geordie

risposta

0

Questo non dovrebbe essere così difficile. Il modo più ingenuo è quello di ls la directory e quindi grep solo per ciò che si vuole:

$ ls *BOZO* | grep -e '123$' -e '456$' 
8

Utilizzando gocce di shell:

ls BOZO*{123,456} 
+0

Nota, ciò richiede bash, zsh o un'altra shell avanzata. Non è portatile e non funzionerà in molti sistemi '/ bin/sh'. –

10

ho fatto quanto segue e ha funzionato

ls BOZO*456 BOZO*123 
+0

Smartass. Ho parlato. – chrisdowney

2

Usa le espressioni regolari per aiutarti. Il comando egrep dovrebbe essere d'aiuto, perché ti permetterà di usare espressioni regolari.

Stai ricerca di file del tipo BOZO456 e BOZO123

un periodo . è una wild card, che consente di sostituire per <anything>. Lo * ti consente di ripeterlo 0 o più volte. Posizionando circa 123 e 456 parentesi tonde, simulerai un OR.

Quindi, si vuole qualsiasi carattere ripetuto 0 o più volte, seguito da 123 o 456.

Esempio:

egrep "BOZO.*(456|123)" data

Grazie a Nathan Fellman per l'aiuto e modifiche.

+0

Ho downvotato questo perché è sbagliato per quanto riguarda la wild card. Nelle espressioni regolari '.' è comunemente il carattere jolly e' * 'significa" 0 o più volte ", quindi questo corrisponderà a" BOZ456 "," BOZOOOOOOOO3 "ecc. –

+0

Risolto!Grazie per l'avviso, e le mie scuse: $ – digerati32

+0

Non è ancora giusto. Questo corrisponderà a 'BOZOa456' e' BOZOx123' ma non a 'BOZOOO123' o anche a' BOZO123'. Quello che ti serve è "" BOZO. * (456 | 123) " –

1

Si potrebbe anche usare trovare comando:

find . \(-name "BOZO*123" -o -name "BOZO*456" \) 
+1

Questo attraversa i bambini. Vuoi trovare. -maxdepth 1 -name "BOZO * 123" -o -name "BOZO * 456" '(in questo caso, le parentesi non sono necessarie). –

Problemi correlati