如何编写 BASH 脚本来查找目录树中的所有 php.ini 文件并将文本附加到其中

如何编写 BASH 脚本来查找目录树中的所有 php.ini 文件并将文本附加到其中

我的托管公司宣传 php 最大上传大小可达 60M,但默认为 2M,我无法更改 htaccess 文件。我可以通过更改 php.ini 文件来覆盖默认值,但必须对目录树中的每个 php.ini 文件都执行此操作。我和许多用户需要并恳求的是可以执行以下任务的 BASH 脚本;

  1. 递归查找 php.ini 文件
  2. 扫描文件中的两行文本(新的 php 指令)
  3. 如果没有这两行文本,则附加这两行文本。保存文件并继续下一个文件。
  4. 如果确实有这两行文本,则不执行任何操作并继续下一个文件。

我已经弄清楚如何找到 .-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

相关内容