Linux procura em arquivos e sub-diretórios

1

precisa de um script / comando que liste todos os arquivos .php que tenham um padrão / string nele.

Ele deve examinar o diretório atual e todos os subdiretórios.

Seja ainda melhor se mostrar o número da linha como:

my new command 
./www/index.php Line 12
./www/lib/config.php Line 123

Além disso, seria possível fazer uma pesquisa e substituir a linha em cada arquivo que tivesse esse padrão?

    
por Derek Organ 25.11.2009 / 13:38

6 respostas

6

grep pode fazer isso sozinho:

grep -rn --include='*.php' "pattern" .
    
por 25.11.2009 / 13:52
1

encontre. -name '* .php' -print0 | xargs -0 grep -n "padrão"

    
por 25.11.2009 / 13:45
0

Eu acho que o seguinte irá fazer a busca e substituição, mas certifique-se de testar isso primeiro porque eu não tenho: -)

find . -type f -name '*.php' -print0 | xargs -0 sed -i '.bak' -e 's/foo/bar/g'

Isso fará o backup de cada arquivo antes de editá-lo, criando arquivos filename.php.bak e atualizando os registros de data e hora em todos os arquivos. Substitui 'foo' por 'bar'. Isso também deve ser seguro para nomes de arquivos com espaços.

    
por 25.11.2009 / 14:03
0

find . -name '*.php' |xargs -I{} perl -i.bak -pe 's/pattern/replacement/' {}

Isto faz um achado de todo arquivo de php. Xargs, em seguida, executa o comando para cada entrada em STDIN passando o valor como {} . Em seguida, Perl lê o arquivo, renomeia-o com a extensão .bak e executa a expressão Perl em todas as linhas do arquivo.

    
por 25.11.2009 / 14:05
0

Isto não serve para substituir o padrão?

encontre. -name "* .php" -exec sed -i ".bak" '/ pattern / replace / g' {} \;

Muito perigoso! Certifique-se de manter o padrão único. : -)

    
por 25.11.2009 / 14:38
0

Use ack, melhor que o grep .

Vantagens (para mais, veja as 10 principais razões para usar ack em vez de grep):

  • Pesquisas recursivamente por padrão
  • Pode reconhecer conjuntos de arquivos comuns (--php) para pesquisar apenas arquivos php, por exemplo
  • Suporta regexs no estilo Perl, pois na verdade é puro Perl.
  • colorido por padrão

Para operações de substituição, você pode usar o ack em combinação com perl ou sed.

    
por 25.11.2009 / 15:39