【问题标题】:Changing site-names in a bash script在 bash 脚本中更改站点名称
【发布时间】:2019-02-05 09:21:51
【问题描述】:

我不想运行对.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 替换该域。

【问题讨论】:

  • 谢谢。佩萨。只是要重新格式化。
  • 我建议将每个站点的配置从您的代码中移出并放入配置文件中。
  • 请澄清。出php代码还是bash脚本代码?
  • 在 PHP 代码之外 - 一个简单的选择是创建一个“ini”样式的配置并使用parse_ini_file

标签: arrays bash variables


【解决方案1】:

@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 版本,因为它在比find 更小的文件集上运行sed(假设您的模式不是在每个文件中)。

长答案

把这些放在一起:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多