#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]
Я посмотрел онлайн на этом сайте, но мне неясно, как справиться с
- создание списка файлов, которые я хочу отредактировать (поэтому найдите все файлы, соответствующие этому пути: /home/*/site/assets/.htaccess)
- Добавление разрывов строк в текст замены
Может ли кто-нибудь предложить ресурс, который четко объяснит это, или потерпит неудачу, дайте мне знать, если я ищу правильные инструменты для этой работы?
Моя операционная система — 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
также будут перечислены обычные файлы, просто не будет отображаться содержимое каталога, если в качестве аргумента указан каталог.