Listar todos os arquivos contendo uma string específica

3

Eu preciso procurar recursivamente todos os arquivos que contêm uma string específica para que eu possa copiar um novo arquivo sobre o antigo. Por exemplo:

Se um arquivo tiver a string "replace me":

  1. encontre o caminho completo dos arquivos:

    /dir/of/file/filename.php
    /dir/of/different/file/filename.php
    
  2. substitua o arquivo por meu novo arquivo filename.php .

Parece simples, mas eu desperdicei várias horas sem chegar a lugar algum.

    
por Scott Elkin 20.08.2011 / 07:04

2 respostas

2
find some/dir \
    -exec grep -q "replace me" {} \; \
    -exec cp some/new/filename.php {} \;
    
por 20.08.2011 / 07:23
5

A solução de Ignacio com find é provavelmente o melhor caminho. Aqui está com todos os detalhes dos comentários incorporados. Estou procurando apenas arquivos (não diretórios) e agrupando três instruções em um grupo com ou instruções para corresponder a qualquer um dos nomes:

find /dir/ \
    -type f \
    \( -name timthumb.php -or -name thumb.php -or -name rt-timthumb.php \) \
    -exec grep -q "timthumb" {} \; \
    -exec cp filename.php {} \;

No entanto, você também pode fazer as descobertas com apenas padrões de shell glob, algo assim:

shopt -s extglob
for file in /dir/**{timthumb,thumb,rt-timthumb}.php; do
    grep -q 'timthumb' "$file" && cp filename.php "$file"
done

Você também pode usar o grep para fazer a pesquisa recursiva em vez de globbing. Isso seria útil se você tivesse muitos arquivos:

grep -l -R -Z 'timthumb' /dir/**thumb.php | while read -d $'
find /dir/ \
    -type f \
    \( -name timthumb.php -or -name thumb.php -or -name rt-timthumb.php \) \
    -exec grep -q "timthumb" {} \; \
    -exec cp filename.php {} \;
' file; do cp filename.php "$file" done

Em todos os casos, substitua "/ dir /" pelo caminho base no qual você deseja operar e "filename.php" pelo arquivo de origem com o qual você irá sobrescrever. Cite conforme necessário. Note que no último exemplo eu usei um atalho para combinar todos os arquivos cujos nomes correspondem "thumb.php". Você poderia fazer isso nos outros exemplos também. No caso de encontrar, você pode soltar todo o conjunto de instruções OR em parens e usar apenas -name '*thumb.php' . Todos os exemplos acima só funcionarão em arquivos que correspondam a esses padrões de nome e contenham a string 'timthumb'.

    
por 20.08.2011 / 08:14

Tags