Não, eles não são equivalentes e, como tal, os resultados quase sempre 1 serão diferentes.
Vamos ver o que cada um desses switches faz:
‘-L’
‘--files-without-match’
Suppress normal output; instead print the name of each input file
from which no output would normally have been printed.
Isso deve ser simples:
grep -L 'pattern' ./*
imprime o nome de cada arquivo que não contém nenhuma linha correspondente a 'pattern'
.
‘-v’
‘--invert-match’
Invert the sense of matching, to select non-matching lines.
Isso também deve ser muito simples:
grep -v 'pattern' ./*
imprime todas as linhas que não correspondem a 'pattern'
de cada arquivo.
‘-l’
‘--files-with-matches’
Suppress normal output; instead print the name of each input file
from which output would normally have been printed.
Novamente, simples:
grep -l 'pattern' ./*
imprime o nome de cada arquivo que contém pelo menos uma linha correspondente a 'pattern'
.
Agora, o que acontece quando combinamos -v
e -l
? Não é muito diferente de grep -l
, exceto que ele seleciona as linhas não correspondentes, portanto, grep -vl 'pattern' ./*
imprime o nome de cada arquivo que contém pelo menos uma linha que não corresponde a 'pattern'
.
Então, observe a diferença:
grep -L
imprime o nome do arquivo somente se não houver correspondência de linha 'pattern'
grep -vl
imprime o nome do arquivo somente se houver pelo menos uma linha não correspondente 'pattern'
1:
Com base no acima, é fácil ver quando esses dois comandos poderiam produzir a mesma saída:
- quando o arquivo não está vazio e todas as linhas correspondem ao padrão - nesse caso, não haverá saída.
-ou quando o arquivo não está vazio e a linha no corresponde ao padrão - caso em que ele será listado
Moral da história: nunca use grep -vl
para emular grep -L
.
Se o seu grep
não suportar -L
, esta é a maneira correta de imitá-lo .