No Windows, se eu quisesse encontrar uma string em todos os arquivos em todos os subdiretórios, faria algo como
findstr /C:"the string" /S *.h
No entanto, no Linux (por exemplo, Ubuntu) eu encontrei nenhuma outra maneira do que alguns comando direcionado envolvendo find
, xargs
e grep
(um exemplo é a esta página: ? Como posso recursivamente grep através de sub-diretórios ). No entanto, minha pergunta é diferente: existe algum comando interno que funcione com essa mágica, sem ter que escrever meu shell script?
*
para'*'
: "É necessário citar o último curinga para evitar erros quando algum nome de arquivo começa com -"-Msomething
ou a umaGREP_OPTIONS
configuração.grep -r searchpattern /path/to/start/in
Onde
/path/to/start/in/
pode ser apenas ".
" para o diretório atual.fonte
Não.
find -name \*.h -print0 | xargs -0 grep -l 'the regex'
É tão mágico quanto ele ganha.fonte
-r
opção. Não há necessidade da artilharia pesada.xargs
adiciona apenas ruído. Usofind -name \*.h -execdir grep -l 'the regex {} +
Para ser pedante, não, você não pode assumir que esse comando existe .
Existem muitas implementações diferentes do Unix, e cada uma tem suas peculiaridades diferentes. POSIX, o denominador comum (e a coisa mais próxima de um padrão nos Unices) não especifica essa opção para
grep
.Como mencionado em outras respostas, a implementação do GNU
grep
possui uma opção não padrão que faz o que você deseja. Embora essa implementação específica possa ser comum em sistemas Linux, você não pode assumir sua disponibilidade em nenhum Unix, mesmo em alguns sistemas Linux.Por fim, devo mencionar que é a filosofia do Unix favorecer a combinação de vários programas primitivos, sobre o uso de um grande executável monolítico tentando fazer tudo de uma vez.
No seu caso, rastrear o sistema de arquivos e regexp correspondente em um fluxo são duas tarefas separadas. É normal tratar cada um em um programa separado.
fonte
Para encontrar a string do diretório especificado, use o comando abaixo
Por exemplo:
fonte
grep
pode usar mais de um arquivo como argumento; portanto, você deve usá-lo em+
vez de\;
evitar executar umagrep
chamada por arquivo, o que é bastante ineficiente.-name '*'
restringe a arquivos cujo nome é texto válido no código do idioma atual (find
pelo menos em algumas implementações), mas os outros componentes de diretório ainda podem conter seqüências de bytes que não formam caracteres válidos. Se sua intenção-name '*'
era garantir que a saída fosse um texto válido (omitindo os arquivos com nomes impróprios), você preferiria usarfind ... ! -name '*' -prune -o -exec grep ... {} +
, o que também impediriafind
de descer para diretórios com nomes impróprios.