【发布时间】:2015-09-26 20:38:31
【问题描述】:
我必须浏览 100 多个站点并将两行添加到所有站点的同一个文件 (sendmail1.php)。 老板想让我手动复制/粘贴这些东西,但肯定有更简单的方法,所以我尝试用 find 和 sed 来做,这两个显然我都没有很好地使用。我只想在包含所有站点的目录的目录中运行一个脚本。
我有这个:
#!/bin/bash
read -p "Which file, sir? : " file
# find . -depth 1 -type f -name 'sendmail1.php' -exec \
sed -i 's/require\ dirname\(__FILE__\).\'\/includes\/validate.php\';/ \
a require_once dirname\(__FILE__\).\'\/includes\/carriersoft_email.php\';' $file
sed -i 's/\else\ if\($_POST[\'email\']\ \&\&\ \($_POST\'work_email\'\]\ ==\ \"\"\)\){/ \
a\t$carriersoft_sent = carriersoft_email\(\);' $file
exit 0
目前,我在尝试在这里整理 sed 并测试脚本时将 find 注释掉了,但我想同时解决这两个问题。
我想我并没有在 sed 位中逃避一些必要的事情,但我一直在检查它并对其进行更改并得到不同的错误(有时是“未完成的 s/ 语句”,其他时候。其他东西。
关键是我必须这样做:
在require dirname(__FILE__).'/includes/validate.php';的正下方,添加这一行:
require_once dirname(__FILE__).'/includes/carriersoft_email.php';
与
在else if($_POST['email'] && ($_POST['work_email'] == "")){ 下,添加这一行:
$carriersoft_sent = carriersoft_email();
我想把这个 4 小时的复制/意大利面噩梦变成一个 2 分钟的懒惰管理类型脚本并完成它。 但是我的 fu 对 sed 或 find 不强... 至于查找,我得到“路径必须先于表达式:1” 我在这里找到了解决该错误的问题,但表明使用 '' 包围文件名应该可以解决它,但它不起作用。
【问题讨论】:
-
"(...) 将两行添加到所有文件中的同一个文件中 (...)" — 那么只更改一个文件并将其复制到所有其他文件不是更容易吗地点?
-
文件的其他部分可能存在其他特定于站点的差异。当我问到“为什么不直接将编辑后的文件复制到所有这些位置?”时,我无法让老板澄清这一点。虽然我vimdiff了一些,但找不到任何区别。
-
好的。我确实收到了老板的回复:“我更愿意编辑每个文件,我不确定我们可能为其他特定网站所做的自定义。”
-
好的,但仅供参考:检查所有此类文件是否相同很容易 - 只需选择其中一个并将其与所有其他文件进行比较:
find . -name 'sendmail1.php' -exec diff -q path/to/reference/senmail1.php {} \;(将path/to/reference/senmail1.php替换为所选文件文件)。diff命令仅在文件不同时才会输出任何内容。如果它们与单个选择的文件相同,则它们都是相同的。 :) -
谢谢。那肯定会派上用场。这些家伙按小时给我发工资,并为这份工作预算了 5 小时,所以我可以按时完成,但我宁愿用效率让他们眼花缭乱。