希望是一个不错的简单的。
我有一个 php3 网站,我想在 php 5.2 上运行
首先,我只想将当前“index.php3”_within_each_file_(递归)的所有引用更改为“index.php”,然后继续担心全局变量等。
K. 去吧!
:)
更新:非常感谢!我意识到我的问题错过了引用在网站的每个文件中的事实,我想在所有文件/文件夹中递归地执行此操作。
find -type f -exec perl -pi -e 's/\bindex\.php3\b/index.php/g' {} \;
怎么样:
for file in *.php3
do
sed 's/\.php3/.php/g' $file > ${file%3}
done
for/do/done 循环依次处理每个 .php3 文件,编辑文件并将每个字符串替换.php3
为.php
,并将文件从 something.php3 复制到 something.php。
为修改后的问题添加:
for file in $(find . -type f -name '*.php3' -print)
do
sed 's/\.php3/.php/g' $file > ${file%3}
done
' -print
' 现在通常可以省略,但从历史上看,很多机器时间被忘记添加它的人浪费了,因为最初(POSIX 之前)没有默认操作。
这个片段是关于对原始代码进行最简单的修改以执行扩展任务,但不一定是最好的方法 - 它在处理任何文件之前预先生成整个文件列表。您可以改为使用:
find . -type f -name '*.php3' -print |
while read file
do
sed 's/\.php3/.php/g' $file > ${file%3}
done
但是,如果文件名或路径名可以包含空格或换行符或其他此类字符,则两个修订版本都可能会遇到问题。为避免此类问题,您必须更加努力——使用 Perl 或 (GNU find + xargs) 或其他一些技术。如果你头脑清醒,你就可以避免这些问题。如果您继承了一个不太健全的设置,那么您可能需要更深入地研究 Unix 文件名处理的奥秘。
sed -i 's/php3/php/g' *
假设您使用的是类 unix 操作系统。
要递归地执行此操作,请使用 Jonathan 的答案,但替换find . -type f
*.php3。请注意,反引号很重要,您可以将任何目录替换为“。” (即当前目录)。这是一个在进程中重命名文件的版本 (*.php3 -> *.php)。
#!/bin/bash
for file in `find . -type f`
do
sed 's/\.php3/\.php/g' $file > ${file//3/}
rm $file
done