Изменение имен сайтов в скрипте bash - PullRequest
0 голосов
/ 30 августа 2018

Я не хочу запускать скрипт, который вносит некоторые изменения в файлы .php. Существуют сотни EmailController.php файлов на разных сайтах, которые должны быть изменены в зависимости от имени сайта в зависимости от того, в какой папке они находятся.

#!/bin/bash
source /root/sitenames.txt
sed -i 's#'"/var/vmail/skeleton.com/"'#'"/var/vmail/$sitename/"'#g' /var/www/$sitename/web/EmailController.php

Самый простой способ - прочитать sitenames.txt файл, который будет содержать доменные имена по одному на строку, и заменить этот домен на $sitename в скрипте bash.

1 Ответ

0 голосов
/ 30 августа 2018

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

Короткий ответ

skeldir="/tmp/skeleton"
skelsite="skeleton.com"
sitename="example.com"

fgrep -lr --null "/var/vmail/${skelsite}/" "${skeldir}" \
| xargs -0 sed -i "" "s#/var/vmail/${skelsite}/#/var/vmail/${sitename}/#g"

Что в основном эквивалентно:

find "${skeldir}" -type f -print0 \
| xargs -0 sed -i "" "s#/var/vmail/${skelsite}/#/var/vmail/${sitename}/#g"

Мне нравится версия fgrep лучше, потому что она запускает sed на меньшем наборе файлов, чем find (при условии, что ваш шаблон не в каждом файле).

Длинный ответ

Собираем это вместе:

$ cat /tmp/x.sh
#!/bin/sh

skeldir="/tmp/skeleton"
skelsite="skeleton.com"
sitename="example.com"

[ -d "${skeldir}" ] && rm -rf "${skeldir}"

mkdir -p "${skeldir}/subdir"

echo 'ignore this line' \
| tee "${skeldir}/file1.php" "${skeldir}/subdir/file2.php" "${skeldir}/file3.php" \
> "${skeldir}/subdir/file4.php"

echo "foo /var/vmail/${skelsite}/ bar" \
| tee -a "${skeldir}/file1.php" >> "${skeldir}/subdir/file2.php"

echo "BEFORE:"
echo "  Files that have \"${skelsite}\": $(fgrep -lr "/var/vmail/${skelsite}/" "${skeldir}" | wc -l)"
echo "  Files that have \"${sitename}\":  $(fgrep -lr "/var/vmail/${sitename}/" "${skeldir}" | wc -l)"

# make changes (--null/-0 ensures you can have spaces, etc, in filenames)
fgrep -lr --null "/var/vmail/${skelsite}/" "${skeldir}" \
| xargs -0 sed -i "" "s#/var/vmail/${skelsite}/#/var/vmail/${sitename}/#g"

# Alternate:
# find "${skeldir}" -type f -print0 \
# | xargs -0 sed -i "" "s#/var/vmail/${skelsite}/#/var/vmail/${sitename}/#g"

echo "AFTER:"
echo "  Files that have \"${skelsite}\": $(fgrep -lr "/var/vmail/${skelsite}/" "${skeldir}" | wc -l)"
echo "  Files that have \"${sitename}\":  $(fgrep -lr "/var/vmail/${sitename}/" "${skeldir}" | wc -l)"

И посмотрим, что произойдет:

$ /tmp/x.sh
BEFORE:
  Files that have "skeleton.com":        2
  Files that have "example.com":         0
AFTER:
  Files that have "skeleton.com":        0
  Files that have "example.com":         2

Вы можете рассмотреть возможность создания резервной копии перед этим! Что-то вроде:

$ rsync -avP --delete /var/www/$sitename/  /var/www.backup/$sitename/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...