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 .