Sei sicuro che ciò che desideri stia accadendo? Quando esegui ls /directory | grep '[^term]'
stai essenzialmente grepping per non le lettere t e r m. Questo significa che se un file ha altre lettere nel suo nome apparirà comunque nell'output di ls
. Prendi ad esempio la seguente directory:
$ ls
alpha brave bravo charlie delta
Ora se eseguo ls |grep '^[brav]'
Ottengo quanto segue:
$ ls |grep '^[brav]'
alpha
brave
bravo
Come puoi vedere, non solo ho ottenuto brave
e bravo
Ho anche ricevuto alpha
perché la classe di caratteri []
riceverà qualsiasi lettera da quella lista.
Di conseguenza, se eseguo ls |grep '[^brav]'
Otterrò tutti i file che non contengono i caratteri b r a v ovunque nel nome.
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
Se noti che includeva l'intero elenco di directory perché tutti i file ne avevano almeno uno lettera che non era inclusa nella classe di caratteri.
Quindi, come ha detto Kanvuanza, grep per l'inverso di "termine" rispetto ai caratteri t e r m
dovresti farlo usando grep -v
.
Ad esempio:
$ ls |grep -v 'brav'
alpha
charlie
delta
Inoltre, se non vuoi che i file contengano caratteri nella classe, usa grep -v '[term]'
. Ciò impedirà la visualizzazione di qualsiasi file che abbia uno di quei caratteri. (risposta di Kanvuanza)
Ad esempio:
$ ls |grep -v '[brav]'
Come puoi vedere non c'erano file elencati perché tutti i file in questa directory includevano almeno una lettera di quella classe.
Appendice:
Volevo aggiungere che usando PCRE è possibile usare solo regex per filtrare usando espressioni negate. Per fare questo useresti qualcosa noto come regex look-ahead negativo:(?!<regex>)
.
Quindi, usando l'esempio sopra, puoi fare qualcosa di simile per ottenere i risultati desiderati senza usare grep
flag.
$ ls | grep -P '^(?!brav)'
alpha
charlie
delta
Per decostruire quella regex, prima corrisponde all'inizio di una riga ^
e quindi cerca le stringhe che non corrispondono a brav
da seguire dopo. Solo alpha
, charlie
e delta
match quindi quelli sono gli unici che vengono stampati.
Immagino che grep -v
flag fa quello che vuoi. Dalla pagina man:
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
Puoi usare ls /directory | grep -v [term]
per stampare tutte le righe non corrispondenti.