Procura e substitui arquivos .htaccess no linux

1

Eu preciso adicionar esta linha a todos os arquivos .htaccess localizados em /home/*/site/assets/.htaccess onde * pode ser qualquer quantidade de diretórios profunda

Eu preciso melhorar este texto

RewriteRule ^(.*)$ /site/assets/sym/$1 [L,NS]

e adicione uma linha acima ou substitua-a por

RewriteCond %{REQUEST_URI} !^/site/assets/sym
RewriteRule ^(.*)$ /site/assets/sym/$1 [L,NS]

Procurei on-line neste site , mas não estou claro como lidar com

  1. gerando uma lista dos arquivos que desejo editar (encontre todos os arquivos que correspondam a esse caminho: / home / * / site / assets / .htaccess)
  2. Adicionando quebras de linha no texto de substituição

Alguém pode sugerir um recurso que explique claramente ou falhe, avise-me se eu estiver procurando as ferramentas corretas para esse trabalho?

Meu sistema operacional é o Cent OS 5.5, estou executando um servidor LAMP se isso fizer muita diferença, apache 2.

Obrigado

    
por Jason 17.10.2011 / 01:12

2 respostas

2

Você escolheu um excelente conjunto de ferramentas para o trabalho!

Gerar uma lista de arquivos que você deseja editar é muito simples - estou aqui supondo que você esteja usando um shell que expandirá a saída de nomes de arquivos correspondentes, como bash ou dash:

echo /home/*/site/assets/.htaccess > list.txt

No entanto, se * puder significar mais de 1 nível de diretórios, eu usaria:

find -name '.htaccess' /home | grep '/site/assets/sym' > list.txt

Seu shell expandirá a expressão em uma lista e redirecionará a saída para list.txt. Um arquivo para cada linha.

Você também pode procurar por arquivos chamados .htaccess com find - para ver se há alguém que você tenha perdido, como este:

find -name '.htaccess' /home

Adicionando quebras de linha no texto de substituição - isso depende um pouco do seu editor. Quebras de linha são geralmente representadas como \n

O que você quer fazer, provavelmente pode ser obtido com um pequeno script de shell - quando for variable in expression; do .... done é usado, ele executará as linhas entre do / done uma vez para cada palavra na expressão. OBSERVAÇÃO : isso pode ser contrafeito se os caminhos contiverem espaços.

for file in /home/*/site/assets/.htaccess; do
    sed 's/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\ \[L,NS\]/RewriteCond %{REQUEST_URI} !^\/site\/assets\/sym\nRewriteRule \^(.\*)\$ \/site\/assets\/sym\/\ \[L,NS\]/g' $file > $file.new
    mv $file $file.old
    mv $file.new $file
done

(Isso deixará um arquivo chamado .htaccess.old no local).

Reescrito para abordagem de coleta de lista alternativa:

for file in $(find -name '.htaccess' /home | grep '/site/assets/sym'); do
    sed 's/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\ \[L,NS\]/RewriteCond %{REQUEST_URI} !^\/site\/assets\/sym\nRewriteRule \^(.\*)\$ \/site\/assets\/sym\/\ \[L,NS\]/g' $file > $file.new
    mv $file $file.old
    mv $file.new $file
done

Ou, em uma linha, sem fazer backup:

for file in /home/*/site/assets/.htaccess; do sed -i 's/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\ \[L,NS\]/RewriteCond %{REQUEST_URI} !^\/site\/assets\/sym\nRewriteRule \^(.\*)\$ \/site\/assets\/sym\/\ \[L,NS\]/g' $file; done
    
por 17.10.2011 / 01:37
2

Você pode usar o sed para inserir a linha acima do padrão correspondente e fazer os backups à medida que avança.

for file in  $( find /home -name .htaccess | grep /site/assets/sym); do
    sed -i.bak '/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\ \[L,NS\]/i RewriteCond %{REQUEST_URI} !^/site/assets/sym' "$file"
done
  • sed -i.bak edita os arquivos no lugar e cria um arquivo .bak para cada um
  • / PATTERN / i outro padrão - corresponde ao PATTERN e insere outro padrão antes dele.
por 17.10.2011 / 09:12