Funciona como mágica! Dica: use em -rLvez de -Lpara coincidir com subdiretórios
Ufos 18/10
1
@ Larry - Uma maneira mais limpa de evitar problemas ocultos é usar a opção longa "vazia" como esta: grep -L 'foo' -- *O padrão é que os comandos que usam opções longas são usadas --para indicar que não há mais opções após esse ponto.
Paddy Landau
45
Dê uma olhada ack. Ele faz a .svnexclusão automaticamente, fornece expressões regulares do Perl e é um download simples de um único programa do Perl.
O equivalente ao que você está procurando deve ser ack:
Você deseja alterar o grep 0 no final para grep 0 $ (caso contrário, você obtém correspondências incorretas nos arquivos que têm o caractere 0 no nome do arquivo).
clouseau 23/12/2009
9
O @clouseau tem quase toda a razão ... No entanto, grep '0$'também corresponderia arquivos com múltiplos de 10 linhas! Você precisa grep ':0$'no final verificar se há um ': 0' explícito no final da linha. Então você receberá apenas arquivos com zero linhas correspondentes.
TrinitronX
O UNIX em que eu estou não possui versões do find ou grep com essas opções, então tive que seguir o comando "ack" sugerido em outros comentários.
KC Baltz
14
O comando a seguir exclui a necessidade de a localização filtrar as svnpastas usando um segundo grep.
Eu preciso refatorar um projeto grande que usa .phtmlarquivos para escrever HTML usando código PHP embutido. Quero usar modelos de bigode . Quero encontrar quaisquer .phtmlgiles que não contenham a string, new Mustachepois eles ainda precisam ser reescritos.
-iname '*.phtml'O nome do arquivo deve conter .phtml( iisso não diferencia maiúsculas de minúsculas)
-exec 'grep -H -E -o -c 'new Mustache' {}'Execute o grepcomando em cada um dos caminhos correspondentes
Grep
-H Sempre imprima cabeçalhos de nome de arquivo com linhas de saída.
-E Interprete o padrão como uma expressão regular estendida (ou seja, force o grep a se comportar como egrep).
-o Imprime apenas a parte correspondente das linhas.
-c Somente uma contagem de linhas selecionadas é gravada na saída padrão.
Isso fornecerá uma lista de todos os caminhos de arquivo que terminam em .phtml, com uma contagem do número de vezes que a string new Mustacheocorre em cada um deles.
Se você estiver usando o git, ele pesquisará todos os arquivos rastreados:
git grep -L "foo"
e você pode procurar em um subconjunto de arquivos rastreados se você tiver ** o globbing do subdiretório ativado ( shopt -s globstarem .bashrc, consulte o seguinte ):
Eu esqueço os comandos, mas em vez de despejar nomes de arquivos, você pode realmente fazer um diffentre dois fluxos de saída (acho que você envolve os comandos entre parênteses, e há um colchete angular em algum lugar também), se o seu sistema suportar, o que eu acho é a questão, uma vez que não suportagrep -L
Dexygen
1
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Você pode especificar o filtro em "localizar" e a cadeia de exclusão em "grep -vwE". Use mtime em find se precisar filtrar também o horário modificado.
Como há pouco progresso no relatório de erros, a -Lopção mencionada abaixo não deve ser considerada , desde que o erro não tenha sido resolvido. Use abordagens diferentes apresentadas neste tópico. Citando um comentário para o relatório de erros [grifo meu]:
Alguma atualização sobre isso? -Lignora completamente as correspondências na primeira linha do arquivo. Parece que, se isso não for corrigido em breve, a bandeira deve ser removida completamente, pois efetivamente não funciona como anunciado .
O Silver Searcher - Ag (função pretendida - consulte o relatório de erros)
Isso imprime as linhas que não contêm o padrão. Você pode adicionar a -lopção para imprimir apenas o nome do arquivo; mas isso ainda imprime os nomes de qualquer arquivo que contenha qualquer linha que não contenha o padrão. Acredito que o OP deseja encontrar os arquivos que não contêm nenhuma linha que contenha o padrão.
tripleee
O comando que você forneceu lista os arquivos em "caminho de arquivo" com todas as suas linhas que não contêm "padrão".
Aprodan 30/05
-6
O comando a seguir pode ajudá-lo a filtrar as linhas que incluem a substring "foo".
Isso imprime linhas que não correspondem, não nomes de arquivos que não contêm correspondência em nenhuma linha. Para adicionar insulto à lesão, é um uso inútil decat .
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)ag -L 'foo'
-rL
vez de-L
para coincidir com subdiretóriosgrep -L 'foo' -- *
O padrão é que os comandos que usam opções longas são usadas--
para indicar que não há mais opções após esse ponto.Dê uma olhada
ack
. Ele faz a.svn
exclusão automaticamente, fornece expressões regulares do Perl e é um download simples de um único programa do Perl.O equivalente ao que você está procurando deve ser
ack
:fonte
Você pode fazer isso apenas com grep (sem encontrar).
Esta é a explicação dos parâmetros usados no
grep
Se você usar
l
(em minúsculas), obterá o oposto (arquivos com correspondências)fonte
O comando a seguir fornece todos os arquivos que não contêm o padrão
foo
:fonte
grep '0$'
também corresponderia arquivos com múltiplos de 10 linhas! Você precisagrep ':0$'
no final verificar se há um ': 0' explícito no final da linha. Então você receberá apenas arquivos com zero linhas correspondentes.O comando a seguir exclui a necessidade de a localização filtrar as
svn
pastas usando um segundogrep
.fonte
Você realmente precisará de:
fonte
Eu tive boa sorte com
Minhas tentativas com
grep -v
apenas me deram todas as falas sem "foo".fonte
Problema
Eu preciso refatorar um projeto grande que usa
.phtml
arquivos para escrever HTML usando código PHP embutido. Quero usar modelos de bigode . Quero encontrar quaisquer.phtml
giles que não contenham a string,new Mustache
pois eles ainda precisam ser reescritos.Solução
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
Explicação
Antes dos tubos:
Encontrar
find .
Encontre arquivos recursivamente, iniciando neste diretório-iname '*.phtml'
O nome do arquivo deve conter.phtml
(i
isso não diferencia maiúsculas de minúsculas)-exec 'grep -H -E -o -c 'new Mustache' {}'
Execute ogrep
comando em cada um dos caminhos correspondentesGrep
-H
Sempre imprima cabeçalhos de nome de arquivo com linhas de saída.-E
Interprete o padrão como uma expressão regular estendida (ou seja, force o grep a se comportar como egrep).-o
Imprime apenas a parte correspondente das linhas.-c
Somente uma contagem de linhas selecionadas é gravada na saída padrão.Isso fornecerá uma lista de todos os caminhos de arquivo que terminam em
.phtml
, com uma contagem do número de vezes que a stringnew Mustache
ocorre em cada um deles.O primeiro canal
grep :0$
filtra esta lista para incluir apenas linhas que terminam em:0
:O segundo
sed 's/..$//'
canal retira os dois caracteres finais de cada linha, deixando apenas os caminhos do arquivo.fonte
Se você estiver usando o git, ele pesquisará todos os arquivos rastreados:
e você pode procurar em um subconjunto de arquivos rastreados se você tiver ** o globbing do subdiretório ativado (
shopt -s globstar
em .bashrc, consulte o seguinte ):fonte
Meu grep não possui nenhuma opção -L. Eu acho uma solução alternativa para conseguir isso.
As idéias são:
faça a diferença entre o arquivo 2 dump com o comando diff.
fonte
diff
entre dois fluxos de saída (acho que você envolve os comandos entre parênteses, e há um colchete angular em algum lugar também), se o seu sistema suportar, o que eu acho é a questão, uma vez que não suportagrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Você pode especificar o filtro em "localizar" e a cadeia de exclusão em "grep -vwE". Use mtime em find se precisar filtrar também o horário modificado.
fonte
Abrir relatório de erro
Conforme comentado por @tukan, há um relatório de bug aberto para a Ag referente ao sinalizador
-L
/--files-without-matches
:--files-without-matches
não funciona corretamenteComo há pouco progresso no relatório de erros, a
-L
opção mencionada abaixo não deve ser considerada , desde que o erro não tenha sido resolvido. Use abordagens diferentes apresentadas neste tópico. Citando um comentário para o relatório de erros [grifo meu]:O Silver Searcher - Ag (função pretendida - consulte o relatório de erros)
Como uma alternativa poderosa
grep
, você pode usar o The Silver Searcher - Ag :Olhando
man ag
, encontramos a opção-L
ou--files-without-matches
:Ou seja, para pesquisar recursivamente os arquivos que não correspondem
foo
, no diretório atual:Para procurar apenas arquivos atuais no diretório atual
foo
, basta especificar--depth=0
a recursão:fonte
-L
erro - github.com/ggreer/the_silver_searcher/issues/238outra alternativa quando grep não possui a opção -L (IBM AIX por exemplo), com nada além de grep e o shell:
fonte
ou
O comando acima nos dará o resultado conforme -v encontra o inverso do padrão que está sendo pesquisado
fonte
-l
opção para imprimir apenas o nome do arquivo; mas isso ainda imprime os nomes de qualquer arquivo que contenha qualquer linha que não contenha o padrão. Acredito que o OP deseja encontrar os arquivos que não contêm nenhuma linha que contenha o padrão.O comando a seguir pode ajudá-lo a filtrar as linhas que incluem a substring "foo".
fonte
cat
.