在bash脚本中更改站点名称

时间:2018-08-30 12:17:00

标签: arrays bash variables

我不会运行对.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文件,该文件每行包含一个域名,并在bash脚本中用$sitename替换该域。

1 个答案:

答案 0 :(得分:0)

@ 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/