Назад | Перейти на главную страницу

Поиск и замена в файлах .htaccess в Linux

Мне нужно добавить эту строку в каждый файл .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.

Спасибо

Вы можете использовать sed, чтобы вставить строку над совпадающим шаблоном и делать резервные копии по ходу.

for file in  $( find /home -name .htaccess | grep /site/assets/sym); do
    sed -i.bak '/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/i RewriteCond %{REQUEST_URI} !^/site/assets/sym' "$file"
done
  • sed -i.bak отредактирует файлы на месте и создаст файл .bak для каждого из них
  • / ШАБЛОН / i другой образец - сопоставить ШАБЛОН и вставить другой образец перед этим.

Вы выбрали отличный набор инструментов для работы!

Создать список файлов, которые вы хотите редактировать, очень просто - я предполагаю, что вы используете оболочку, которая расширяет вывод совпадающих имен файлов, таких как bash или тире:

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

Однако если * может означать более 1 уровня каталогов, я бы пошел с этим:

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

Ваша оболочка развернет выражение в список и перенаправит вывод в list.txt. По одному файлу на каждую строку.

Вы также можете искать файлы с именем .htaccess с помощью find - чтобы увидеть, есть ли кто-нибудь, кого вы пропустили, например:

find -name '.htaccess' /home

Добавление разрывов строк в заменяемый текст - это немного зависит от вашего редактора. Разрывы строк обычно представлены как \n

То, что вы хотите сделать, вероятно, может быть достигнуто с помощью небольшого сценария оболочки - когда for variable in expression; do .... done , он будет выполнять строки между do / done один раз для каждого слова в выражении. НОТА: Это может иметь неприятные последствия, если пути содержат пробелы.

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

(На этом месте останется файл с именем .htaccess.old.)

Переписано для альтернативного подхода к сбору списков:

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

Или одной строкой, не делая резервную копию:

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