1

希望是一个不错的简单的。

我有一个 php3 网站,我想在 php 5.2 上运行

首先,我只想将当前“index.php3”_within_each_file_(递归)的所有引用更改为“index.php”,然后继续担心全局变量等。

K. 去吧!

:)

更新:非常感谢!我意识到我的问题错过了引用在网站的每个文件中的事实,我想在所有文件/文件夹中递归地执行此操作。

4

4 回答 4

5
find -type f -exec perl -pi -e 's/\bindex\.php3\b/index.php/g' {} \;
于 2008-11-21T06:29:37.863 回答
4

怎么样:

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 文件名处理的奥秘。

于 2008-11-21T04:05:23.770 回答
2

sed -i 's/php3/php/g' *

假设您使用的是类 unix 操作系统。

于 2008-11-21T04:04:07.720 回答
1

要递归地执行此操作,请使用 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
于 2008-11-21T05:49:16.730 回答