我的托管公司宣传 php 最大上传大小可达 60M,但默认为 2M,我无法更改 htaccess 文件。我可以通过更改 php.ini 文件来覆盖默认值,但必须对目录树中的每个 php.ini 文件都执行此操作。我和许多用户需要并恳求的是可以执行以下任务的 BASH 脚本;
- 递归查找 php.ini 文件
- 扫描文件中的两行文本(新的 php 指令)
- 如果没有这两行文本,则附加这两行文本。保存文件并继续下一个文件。
- 如果确实有这两行文本,则不执行任何操作并继续下一个文件。
我已经弄清楚如何找到 .-ifile php.ini 并附加(不正确)需要添加的两行。
即使如此,如果我弄清楚如何正确地附加行,再次运行时它会再次附加行。不仅仅是附加到需要修复的新文件。
如果有人能帮助我
find . -ifile php.ini -exec ?????? '{}' \;
我可以自己想办法完成剩下的部分。
答案1
我会选择这种方法:
#!/bin/bash
path='/path'
line1='foo'
line2='bar'
while read f; do
if [ ! "$(grep "$line1" "$f")" ] && [ ! "$(grep "$line2" "$f")" ]; then
echo "$line1" >> "$f"
echo "$line2" >> "$f"
fi
done < <(find "$path" -type f -name 'php.ini')
一些说明:
$path
在内部声明/初始化,但如果更方便的话,它可以作为参数传递给脚本,只需很少的修改;find "$path" -type f -name 'php.ini'
在外部 shell 中执行,并且while
使用进程替换将其输出重定向到循环,因为将其输出直接传输到while
循环将会$line1
离开$line2
循环while
的范围;-type f
可能find "$path" -type f -name 'php.ini'
是多余的,但只是为了安全;- 这两个
echo
命令可以合并为一个echo
命令,但是那样就需要添加一个-e
选项来转义该\n
序列;如果不知道要附加的确切字符串(可能包含其他转义序列),则不使用选项-e
而使用两个echo
命令会更安全;
脚本以递归方式搜索路径php.ini
中命名的任何文件$path
;对于每个文件,如果两个grep
命令都进入if
语句不返回(即,如果在文件中0
既找不到包含/匹配字符串的行$line1
,也找不到包含/匹配字符串的行),并将其附加到文件末尾。$line2
$line1
$line2
测试层次结构的示例输出:
user@debian ~/tmp % tree -a
.
├── 1
│ ├── 2
│ │ ├── 3
│ │ │ ├── file
│ │ │ └── php.ini
│ │ ├── file
│ │ └── php.ini
│ ├── file
│ └── php.ini
└── script.sh
3 directories, 7 files
user@debian ~/tmp % find 1 -type f -exec bash -c 'echo -e "{}:\n"; cat {}; echo' \;
1/php.ini:
foo
bar
another line
1/file:
foo
bar
another line
1/2/3/php.ini:
foo
bar
another line
1/2/3/file:
foo
bar
another line
1/2/php.ini:
just one line
1/2/file:
foo
bar
another line
user@debian ~/tmp % bash script.sh
user@debian ~/tmp % find 1 -type f -exec bash -c 'echo -e "{}:\n"; cat {}; echo' \;
1/php.ini:
foo
bar
another line
1/file:
foo
bar
another line
1/2/3/php.ini:
foo
bar
another line
1/2/3/file:
foo
bar
another line
1/2/php.ini:
just one line
foo
bar
1/2/file:
foo
bar
another line