Как заменить «php3» на «php» внутри каждого файла в каталоге - PullRequest
1 голос
/ 21 ноября 2008

Надеюсь, хороший простой.

У меня есть сайт php3, который я хочу запустить на php 5.2

Для начала я бы хотел, чтобы каждая ссылка на текущий "index.php3" _within_each_file_ (рекурсивно) была изменена на "index.php", а затем перешла к беспокойству о глобальных переменных и т. Д.

K. Go!

:)

Обновление: большое спасибо! Я понимаю, что мой вопрос пропустил тот факт, что ссылки есть в каждом файле веб-сайта, и я хотел сделать это рекурсивно во всех файлах / папках.

Ответы [ 4 ]

5 голосов
/ 21 ноября 2008
find -type f -exec perl -pi -e 's/\bindex\.php3\b/index.php/g' {} \;
4 голосов
/ 21 ноября 2008

Как насчет:

for file in *.php3
do
    sed 's/\.php3/.php/g' $file > ${file%3}
done

Цикл for / do / done обрабатывает каждый файл .php3 по очереди, редактирует файл и заменяет каждую строку .php3 на .php, а также копирует файл из чего-то .php3 в нечто .php.

Добавлено для измененного вопроса:

for file in $(find . -type f -name '*.php3' -print)
do
    sed 's/\.php3/.php/g' $file > ${file%3}
done

В наши дни '-print' обычно можно опустить, но исторически много машинного времени было потрачено впустую людьми, которые забыли добавить его, потому что изначально (до POSIX) не было никаких действий по умолчанию.

Этот фрагмент о самой простой модификации исходного кода для выполнения расширенной задачи, но не обязательно является лучшим способом сделать это больше - он предварительно генерирует весь список файлов перед обработкой любого. Вместо этого вы можете использовать:

find . -type f -name '*.php3' -print |
while read file
do
    sed 's/\.php3/.php/g' $file > ${file%3}
done

Однако обе исправленные версии могут столкнуться с проблемами, если имена файлов или пути могут содержать пробелы, символы новой строки или другие подобные символы. Чтобы избежать таких проблем, вы должны работать усерднее - используя Perl или (GNU find + xargs) или некоторые другие методы. Если вы в здравом уме, вы избегаете таких проблем. Если вы унаследовали менее чем вменяемые настройки, вам, возможно, придется углубиться в тайны обработки имен файлов Unix.

2 голосов
/ 21 ноября 2008

sed -i 's/php3/php/g' *

Предполагается, что вы используете Unix-подобную операционную систему.

1 голос
/ 21 ноября 2008

Чтобы сделать это рекурсивно, используйте ответ Джонатана, но замените find . -type f на * .php3. Обратите внимание, что обратные галочки важны, и вы можете заменить любой каталог на «.» (т.е. текущий каталог). Вот версия, которая также переименовывает файл в процессе (* .php3 -> * .php).

#!/bin/bash
for file in `find . -type f`
do
    sed 's/\.php3/\.php/g' $file > ${file//3/}
    rm $file
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...