Tem certeza de que o que você quer está acontecendo? Quando você executa, ls /directory | grep '[^term]'
você está essencialmente esperando por não as letras ter m. Isso significa que se um arquivo tiver outras letras em seu nome, ele ainda aparecerá na saída de ls
. Tome o seguinte diretório, por exemplo:
$ ls
alpha brave bravo charlie delta
Agora, se eu executar ls |grep '^[brav]'
, recebo o seguinte:
$ ls |grep '^[brav]'
alpha
brave
bravo
Como você pode ver, não só recebi brave
como bravo
também alpha
porque a classe de personagem []
receberá qualquer letra dessa lista.
Conseqüentemente, se eu executar ls |grep '[^brav]'
, vou obter todos os arquivos que não contêm os caracteres brav em qualquer lugar do nome.
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
Se você notar, ela incluiu toda a lista de diretórios 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 grep pelo inverso de "termo", em oposição aos caracteres, t e r m
você deve fazê-lo usando grep -v
.
Por exemplo:
$ ls |grep -v 'brav'
alpha
charlie
delta
Além disso, se você não quiser usar os arquivos que possuem caracteres na classe grep -v '[term]'
. Isso impedirá a exibição de arquivos com esses 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.
Termo aditivo:
Eu queria acrescentar que, usando o PCRE, é possível usar apenas regex para filtrar usando expressões negadas. Para fazer isso você usaria algo conhecido como um negativo regex olhar em frente: (?!<regex>)
.
Portanto, usando o exemplo acima, você pode fazer algo assim para obter os resultados desejados sem usar grep
sinalizadores.
$ ls | grep -P '^(?!brav)'
alpha
charlie
delta
Para desconstruir esse regex, ele primeiro corresponde no início de uma linha ^
e, em seguida, procura por seqüências que não correspondem brav
a seguir. Apenas alpha
, charlie
e delta
jogo assim que aqueles são os únicos que são impressos.
grep
linhas começando com term. Ou você deseja grep para linhas que não contêm termo?