Você também pode usar a globstar.
Construir grep
comandos com find
, como na resposta de Zanna , é uma maneira altamente robusta, versátil e portátil de fazer isso (consulte também a resposta de sudodus ). E muru publicou uma excelente abordagem ao usar grep
a --include
opção . Mas se você deseja usar apenas o grep
comando e seu shell, existe outra maneira de fazer isso - você pode fazer com que o próprio shell execute a recursão necessária :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
A -H
bandeira faz grep
mostrar o nome do arquivo, mesmo que apenas um arquivo correspondente seja encontrado. Você pode passar o -a
, -i
e -n
bandeiras (a partir do seu exemplo) para grep
, assim, se é isso que você precisa. Mas não passe -r
ou -R
ao usar este método. É o shell que repete os diretórios na expansão do padrão global que contém **
, e nãogrep
.
Essas instruções são específicas para o shell Bash. O Bash é o shell de usuário padrão no Ubuntu (e na maioria dos outros sistemas operacionais GNU / Linux); portanto, se você está no Ubuntu e não sabe qual é o seu shell, é quase certamente o Bash. Embora os shells populares geralmente suportem **
globs que atravessam o diretório , eles nem sempre funcionam da mesma maneira. Para mais informações, consulte Stéphane Chazelas 's excelente resposta a O resultado de ls *, ls ** e ls *** em Unix.SE .
Como funciona
Ligar o globstar festa opção shell faz **
caminhos jogo contendo o separador de diretório ( /
). É, portanto, um globo recorrente no diretório. Especificamente, como man bash
explica:
Quando a opção shell globstar está ativada e * é usado em um contexto de expansão de nome de caminho, dois * s adjacentes usados como um padrão único correspondem a todos os arquivos e zero ou mais diretórios e subdiretórios. Se seguido por /, dois * s adjacentes corresponderão apenas a diretórios e subdiretórios.
Você deve ter cuidado com isso, pois é possível executar comandos que modificam ou excluem muito mais arquivos do que você pretende, especialmente se você escrever **
quando pretender *
. (É seguro neste comando, que não altera nenhum arquivo.) shopt -u globstar
Desativa a opção shell do globstar.
Existem algumas diferenças práticas entre globstar e find
.
find
é muito mais versátil que a globstar. Tudo o que você pode fazer com a globstar, também pode fazer com o find
comando. Eu gosto da globstar, e às vezes é mais conveniente, mas a globstar não é uma alternativa geralfind
.
O método acima não procura nos diretórios cujos nomes começam com a .
. Às vezes você não deseja recursar essas pastas, mas às vezes deseja.
Como em um globo comum, o shell cria uma lista de todos os caminhos correspondentes e os passa como argumentos para o seu comando ( grep
) no lugar do próprio globo. Se você tiver tantos arquivos chamados file.txt
que o comando resultante seria muito longo para a execução do sistema, o método acima falhará. Na prática, você precisaria (pelo menos) de milhares desses arquivos, mas isso poderia acontecer.
Os métodos utilizados find
não estão sujeitos a esta restrição, porque:
O jeito de Zanna cria e executa um grep
comando com potencialmente muitos argumentos de caminho. Porém, se forem encontrados mais arquivos do que os que podem ser listados em um único caminho, a ação +
terminada -exec
executará o comando com alguns dos caminhos, em seguida, executará novamente com mais alguns caminhos e assim por diante. No caso de grep
ing para uma cadeia de caracteres em vários arquivos, isso produz o comportamento correto.
Como o método globstar abordado aqui, ele imprime todas as linhas correspondentes, com caminhos anexados a cada um.
O caminho de sudodus é executado grep
separadamente para cada um file.txt
encontrado. Se houver muitos arquivos, pode ser mais lento que alguns outros métodos, mas funciona.
Esse método localiza arquivos e imprime seus caminhos, seguidos por linhas correspondentes, se houver. Este é um formato de saída diferente do formato produzido pelo meu método, o de Zanna e o de Muru .
Obtendo cores com find
Um dos benefícios imediatos do uso da globstar é, por padrão no Ubuntu, grep
produzir uma saída colorida. Mas você pode facilmente obter isso com find
, também .
As contas de usuário no Ubuntu são criadas com um alias que grep
realmente funciona grep --color=auto
(execute alias grep
para ver). É bom que os aliases sejam expandidos apenas quando você os emitir de maneira interativa , mas isso significa que, se você quiser find
chamar grep
com o --color
sinalizador, precisará escrevê-lo explicitamente. Por exemplo:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +