man
man grep
nos diz que
The period . matches any single character.
Isso significa que .c
corresponde a qualquer caractere único seguido por um c . Como você não ancorou sua expressão, isso corresponde a qualquer string que contenha qualquer caractere seguido por um c .
Vamos testar isso. E se não usarmos o sinal -v
?
teste
Vamos ver. Primeiro, montamos um teste
~ $ mkdir test
~ $ cd test
~/test $ touch arrays.c
~/test $ touch basic0
~/test $ touch basic0.c
~/test $ touch fromfb
~/test $ touch fromfb.c
~/test $ touch oute
~/test $ touch oute.c
~/test $ touch segmen.c
~/test $ touch simp
~/test $ touch simp.c
~/test $ ls
arrays.c basic0.c fromfb.c oute.c simp
basic0 fromfb oute segmen.c simp.c
Em seguida, testamos ls | grep .c
:
~/test $ ls|grep .c
arrays.c
basic0
basic0.c
fromfb.c
oute.c
segmen.c
simp.c
Como você pode ver, não apenas as fontes C pretendidas correspondem, mas o arquivo binário basic0
também corresponde. O i é correspondido pelo .
e o c é correspondido por (não é surpresa aqui) o c
.
solução
Você deseja corresponder fontes C para excluí-las. Esses arquivos terminam com .c , então nós dizemos ao grep para combinar com eles.
~/test $ ls|grep "\.c$"
arrays.c
basic0.c
fromfb.c
oute.c
segmen.c
simp.c
Nós fizemos duas coisas aqui. Primeiro, escapamos do ponto, para torná-lo um ponto literal em vez de "qualquer caractere único". Mas isso ainda corresponderia a um arquivo chamado foo.c.bar
, que pode ou não ser seu objetivo.
Assumindo que não é, também ancoramos o c para ser o último caractere. Agora você está combinando as seqüências de caracteres que terminam com um ponto e um c .
A reaplicação de -v
é deixada como um exercício para o leitor.