Мне нужно добавить эту строку в каждый файл .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]
Я смотрел онлайн на это сайт но я не понимаю, как бороться с
Может ли кто-нибудь предложить ресурс, который четко объяснит это, или не справится, дайте мне знать, ищу ли я правильные инструменты для этой работы?
Моя ОС - 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
Вы выбрали отличный набор инструментов для работы!
Создать список файлов, которые вы хотите редактировать, очень просто - я предполагаю, что вы используете оболочку, которая расширяет вывод совпадающих имен файлов, таких как 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