Tem certeza de que o que você quer está acontecendo?
Quando você executa ls /directory | grep '[^term]'
você está essencialmente usando as letras t e r m. Isso significa que, se um arquivo tiver outras letras em seu nome, ele ainda aparecerá na saída de ls
. Pegue o seguinte diretório por exemplo:
$ ls
alpha brave bravo charlie delta
Agora, se eu executar ls |grep '^[brav]'
, obtenho o seguinte:
$ ls |grep '^[brav]'
alpha
brave
bravo
Como você pode ver, eu não só obtive brave
e bravo
como também recebi alpha
porque a classe de caracteres []
obterá qualquer letra dessa lista.
Consequentemente, se eu executar ls |grep '[^brav]'
, irei obter todos os arquivos que não contenham os caracteres b r a v em qualquer lugar no nome.
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
Se você perceber que ele incluiu toda a listagem do diretório, porque todos os arquivos tinham pelo menos uma letra que não foi incluída na classe de caracteres.
Então, como Kanvuanza disse, para buscar o inverso de "termo" em oposição aos caracteres t e r m
, você deve fazer isso usando grep -v
.
Por exemplo:
$ ls |grep -v 'brav'
alpha
charlie
delta
Além disso, se você não quiser que os arquivos que possuem caracteres na classe usem grep -v '[term]'
. Isso impedirá a exibição de qualquer arquivo que tenha algum desses caracteres. (Resposta de Kanvuanza)
Por exemplo:
$ ls |grep -v '[brav]'
Como você pode ver, não havia arquivos listados porque todos os arquivos desse diretório incluíam pelo menos uma letra dessa classe.
Adendo:
Eu queria acrescentar que usando o PCRE é possível usar apenas regex para filtrar usando expressões negativas. Para fazer isso, você usaria algo conhecido como regex de look-ahead negativo: (?!<regex>)
.
Portanto, usando o exemplo acima, você pode fazer algo assim para obter os resultados desejados sem usar grep
flags.
$ ls | grep -P '^(?!brav)'
alpha
charlie
delta
Para desconstruir esse regex, ele primeiro faz a correspondência no início de uma linha ^
e, em seguida, procura sequências que não correspondem a brav
a seguir posteriormente. Apenas alpha
, charlie
e delta
correspondem, então, esses são os únicos que são impressos.