поиск и замена в определенных файлах htaccess — linux

#linux #.htaccess #sed

#linux #.htaccess #sed

Вопрос:

Мне нужно добавить эту строку в каждый файл .htaccess, который находится в /home/*/site/assets/.htaccess где * может быть любое количество каталогов глубоко

Мне нужно найти этот текст

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

и добавьте строку над ним или замените ее этим

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

Я посмотрел онлайн на этом сайте, но мне неясно, как справиться с

  1. создание списка файлов, которые я хочу отредактировать (поэтому найдите все файлы, соответствующие этому пути: /home/*/site/assets/.htaccess)
  2. Добавление разрывов строк в текст замены

Может ли кто-нибудь предложить ресурс, который четко объяснит это, или потерпит неудачу, дайте мне знать, если я ищу правильные инструменты для этой работы?

Моя операционная система — Cent OS 5.5, я использую сервер LAMP, если это имеет большое значение, apache 2.

Спасибо

Ответ №1:

 #!/bin/bash
  

Что-то вроде этого:

 for dir in `find /home -type d | grep 'site/assets'`
do
    htaccess="$dir/.htacess";
    sed -ibak -e 's@RewriteRule ^(.*)$ /site/assets/sym/$1 [L,NS]@RewriteCond %{REQUEST_URI} !^/site/assets/symn@' $htaccess
done
  

На моем ящике:

 sed -e 's@RewriteRule ^(.*)$ /site/assets/sym/$1 [L,NS]@RewriteCond %{REQUEST_URI} !^/site/assets/symn@' test
Foobarlol

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

Bleh
  

с помощью test

 Foobarlol

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

Bleh
  

Комментарии:

1. Бесполезное использование Ls в обратных ссылках partmaps.org/era/unix/award.html — вы имеете в виду for dir in /home/* простой.

2. … но это также не позволяет найти подкаталоги. Вам нужно find выполнить рекурсию.

3. @tripleee бесполезно, я не уверен, потому что я не хочу, чтобы какой-либо файл находился в домашних каталогах, а для подкаталогов я неправильно прочитал OP. Спасибо за замечание.

4. Прочитайте ссылку, это обычный антипаттерн для программирования в оболочке. Способ, которым вы изменили его, чтобы найти в обратных ссылках, также обсуждается на странице, хотя в данном конкретном случае я бы расценил это как доброкачественное.

5. … и обратите внимание, что ls -ld также будут перечислены обычные файлы, просто не будет отображаться содержимое каталога, если в качестве аргумента указан каталог.