Quero encontrar todos os arquivos que contêm uma sequência específica de texto. O grep
comando funciona, mas não sei como usá-lo para todos os diretórios (só posso fazê-lo no meu diretório atual). Tentei ler man grep
, mas não deu nenhuma ajuda.
command-line
grep
Smile.Hunter
fonte
fonte
--include="*.C"
opção @ user311346, graças a @Lekensteyn.Respostas:
Seria melhor usar
Onde
-r
(ou--recursive
) é usada para percorrer também todos os subdiretórios de/path
, enquanto-l
(ou--files-with-matches
) é usada para imprimir apenas nomes de arquivos de arquivos correspondentes, e não as linhas correspondentes (isso também pode melhorar a velocidade, dado quegrep
para de ler um arquivo na primeira correspondência com esta opção).fonte
-rlF
switches,-F
para "string fixa" (e não regexp - por exemplo). Claro, se a tarefa estava usando regexps, desculpe-me. Certamente, a mesma teoria sem -r também, muitas vezes vejo que as pessoas assumem o "texto" das pesquisas grep e isso pode causar problemas, os quais especiais significam algo como um regexp.-i
bandeira que ignora maiúsculas e minúsculas.--recursive
opção, existem inúmeras opções e cenários de uso sobre os quais podemos falar. Comecei a partir da resposta aceita pelo @dmityugov e modifiquei para trabalhar semfind
.--include '*.h'
Se você estiver procurando por linhas correspondentes nos arquivos, meu comando favorito é:
-H
faz com que o nome do arquivo seja impresso (implícito quando vários arquivos são pesquisados)-r
faz uma pesquisa recursiva-n
faz com que o número da linha seja impressopath/to/files
pode ser.
procurar no diretório atualOutras opções que eu acho muito úteis:
-I
ignorar arquivos binários (complemento:-a
tratar todos os arquivos como texto)-F
tratarsearch term
como uma expressão literal, não regular-i
faça uma pesquisa que não diferencia maiúsculas de minúsculas--color=always
para forçar as cores, mesmo durante a passagemless
. Para criarless
cores de suporte, você precisa usar a-r
opção:--exclude-dir=dir
útil para excluir diretórios como.svn
e.git
.fonte
-H
em uma pasta é redundante, se houver mais de um arquivo, como é provável. Na verdade, a página homem diz-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
--include '*.*'
grep --exclude='*~' ...
Eu acredito que você pode usar algo como isto:
Explicação dos comentários
find
é um comando que permite encontrar arquivos e outros objetos, como diretórios e links, nos subdiretórios de um determinado caminho. Se você não especificar uma máscara que os nomes de arquivos devem atender, ele enumera todos os objetos de diretório.-type f
especifica que ele deve processar apenas arquivos, não diretórios etc.-exec grep
especifica que, para cada arquivo encontrado, ele deve executar o comando grep, passando seu nome de arquivo como argumento, substituindo{}
pelo nome do arquivofonte
-name '*.py'
restringe as correspondências aos arquivos que terminam em '.py'.... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
Meu comando padrão é
Eu uso um capitólio 'R' porque o
ls
usa para recursivo. Como o grep aceita os dois, não há razão para não usá-lo.EDIT: por HVNSweeting, aparentemente
-R
seguirá links simbólicos onde, como-r
não será.fonte
shopt -s dotglob
(lembre-se de-s
"definir"). Tenha cuidado ao remover arquivos então. Se você ativou o dotglob,rm -r *
remove tudo o que está no diretório atual, mas também o diretório acima, porque..
corresponde. Para desativar o dotglob, useshopt -u dotglob
("unset"). As mudanças são temporárias, mas se aplicam apenas ao shell atual.shopt -s dotglob & <grep cmd> & shopt -y dotglob
apenas mais conveniente? Desta forma, não terá de se preocupar com redefini-logrep -Rin string .
na maioria desses casos. Eu apenas uso * porque parece vir mais naturalmente.R
seguirá links simbólicos,r
nãoSe você estiver disposto a tentar algo novo, tente
ack
. O comando para pesquisar recursivamente o diretório atualstring
é:A instalação é bastante simples:
(Desde que você já tenha o diretório
~/bin
e ele esteja de preferência no seuPATH
.)fonte
chmod
comando fazem? Eles são específicoschmod
ou estão relacionados ao bash (a!#:3
parte)?!
é um designador de eventos . Eles são muito poderosos para evitar repetições.!#:3
referencia o terceiro token da linha de comando até o momento, ou seja~/bin/ack
, neste caso.O comando rgrep é dedicado a essa necessidade
Se não estiver disponível, você pode obtê-lo assim
Você pode definir diretamente em suas opções padrão de grep, conforme descrito acima.
Eu pessoalmente uso
tópico relacionado: como sempre usar rgrep com cores
fonte
Atualização 2:
Esta linha de comandos usando
find
egrep
corrigindo o problema:--color=<always or auto>
para saída colorida:Exemplo:
Um exemplo executado na captura instantânea abaixo:
Atualização 1:
Você pode tentar seguir o código; como uma função em seu
.bashrc
ou.bash_aliases
ou em um script:Uso:
wherein /path/to/search/in/ searchkeyword
exemplo:
(Nota: Conforme sugerido nos comentários abaixo por @enzotib, isso não funciona com arquivos / diretórios, incluindo espaços em seus nomes.)
Postagem original
Para procurar a sequência e gerar apenas essa linha com a sequência de pesquisa:
por exemplo:
Para exibir o nome do arquivo que contém a string de pesquisa:
por exemplo:
fonte
grep
, ao lado do subconjunto que usafind
comgrep
... mas se você deseja aceitar diferentes opções e ajustes como uma resposta distinta, provavelmente o meu vai caber aqui também .. ou você é diferente? a última atualização faz o que eu gostaria na minha pesquisa: nomes de arquivos com linhas com chave de pesquisa e linha não. também :) e saída colorida e filtro de erros para melhor legibilidade ..grep
( GNU ou BSD )Você pode usar a
grep
ferramenta para pesquisar recursivamente a pasta atual com o-r
parâmetro, como:Nota:
-r
- Pesquise recursivamente subdiretórios.Para pesquisar em arquivos específicos, você pode usar uma sintaxe invejável , como:
Nota: Ao usar a opção globbing (
**
), ele verifica todos os arquivos recursivamente com extensão ou padrão específico. Para habilitar essa sintaxe, execute:shopt -s globstar
. Você também pode usar**/*.*
para todos os arquivos (excluindo oculto e sem extensão) ou qualquer outro padrão.Se você tiver o erro de que seu argumento é muito longo, considere restringir sua pesquisa ou use a
find
sintaxe, como:Como alternativa, use
ripgrep
.ripgrep
Se você estiver trabalhando em projetos maiores ou em arquivos grandes, deve usar
ripgrep
, como:Confira os documentos, as etapas de instalação ou o código-fonte na página do projeto GitHub .
É muito mais rápido do que qualquer outra ferramenta como o GNU / BSD
grep
,ucg
,ag
,sift
,ack
,pt
ou similar, uma vez que é construído em cima do motor de regex de Rust que usa autômatos finitos, SIMD e otimizações literais agressivos para tornar a busca muito rápido.Ele suporta padrões de ignorar especificados em
.gitignore
arquivos, para que um único caminho de arquivo possa ser comparado com vários padrões glob simultaneamente.Você pode usar os parâmetros comuns, como:
-i
- Pesquisa insensível.-I
- Ignore os arquivos binários.-w
- Pesquise as palavras inteiras (ao contrário da correspondência parcial de palavras).-n
- Mostre a linha do seu jogo.-C
/--context
(por exemplo-C5
) - Aumenta o contexto, para que você veja o código ao redor.--color=auto
- Marque o texto correspondente.-H
- Exibe o nome do arquivo onde o texto é encontrado.-c
- Exibe contagem de linhas correspondentes. Pode ser combinado com-H
.fonte
Eu faço isso usando xargs, um comando muito subestimado
find ./ fornece uma lista recursiva de todos os arquivos em uma pasta atual e, em seguida, você o envia para o xargs que executa o comando grep em cada um desses arquivos
fonte
xargs
sem-print0
opção parafind
e-0
opção paraxargs
está obsoleto, ele falhará nos nomes de arquivos que contêm espaços.Sei que há muitas respostas aqui, mas aqui está uma alternativa, se você quiser adicionar outras restrições ao pesquisar os arquivos:
Isso funciona porque
grep
retornará 0 se encontrou um resultado, 1 caso contrário. Por exemplo, você pode encontrar arquivos com 1 MB de tamanho e contendo algo:Para vários requisitos, você provavelmente deseja usar o sinalizador otimizador
-O
que existe no GNU grep.fonte
Um script (localizar no código) para pesquisar em C, código CPP:
Usar:
fonte