Sei sicuro di quello che vuoi che accada? Quando corri, ls /directory | grep '[^term]'
stai essenzialmente prendendo in giro non le lettere. Ciò 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 corro ls |grep '^[brav]'
ottengo il seguente:
$ ls |grep '^[brav]'
alpha
brave
bravo
Come puoi vedere, non solo ho avuto brave
e bravo
ho anche alpha
perché la classe di personaggi []
riceverà qualsiasi lettera da quella lista.
Di conseguenza, se corro, ls |grep '[^brav]'
otterrò tutti i file che non contengono i caratteri brav in qualsiasi parte del nome.
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
Se noti che includeva l'intero elenco di directory perché tutti i file avevano almeno una lettera che non era inclusa nella classe di caratteri.
Quindi, come ha detto Kanvuanza, per invocare l'inverso del "termine" in contrapposizione ai personaggi t e r m
che dovresti fare usando grep -v
.
Per esempio:
$ ls |grep -v 'brav'
alpha
charlie
delta
Inoltre, se non desideri utilizzare i file che contengono caratteri nella classe grep -v '[term]'
. Ciò impedirà la visualizzazione di qualsiasi file con uno di questi caratteri. (La risposta di Kanvuanza)
Per 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.
Addendum:
Volevo aggiungere che usando PCRE è possibile usare solo regex per filtrare usando espressioni negative. Per fare questo si può usare qualcosa di noto come un fatto negativo look-ahead regex: (?!<regex>)
.
Quindi, usando l'esempio sopra, puoi fare qualcosa del genere per ottenere i risultati desiderati senza usare le grep
bandiere.
$ 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 brav
da seguire in seguito. Solo alpha
, charlie
e delta
abbina in modo che quelli siano gli unici stampati.
grep
linee che iniziano con il termine. Oppure vuoi grep per le linee che non contengono affatto un termine?