Você também pode usar a globstar.
Construir grepcomandos 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 grepa --includeopção . Mas se você deseja usar apenas o grepcomando 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 -Hbandeira faz grepmostrar o nome do arquivo, mesmo que apenas um arquivo correspondente seja encontrado. Você pode passar o -a, -ie -nbandeiras (a partir do seu exemplo) para grep, assim, se é isso que você precisa. Mas não passe -rou -Rao 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 bashexplica:
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 globstarDesativa 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 findcomando. 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.txtque 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 findnão estão sujeitos a esta restrição, porque:
O jeito de Zanna cria e executa um grepcomando 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 -execexecutará o comando com alguns dos caminhos, em seguida, executará novamente com mais alguns caminhos e assim por diante. No caso de greping 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 grepseparadamente para cada um file.txtencontrado. 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, grepproduzir 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 greprealmente funciona grep --color=auto(execute alias greppara ver). É bom que os aliases sejam expandidos apenas quando você os emitir de maneira interativa , mas isso significa que, se você quiser findchamar grepcom o --colorsinalizador, precisará escrevê-lo explicitamente. Por exemplo:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +