2008-11-21 25 views
1

希望這是一個很好的簡單程序。如何在目錄中的每個文件中用'php'代替'php3'

我有一個PHP3網站,我想上運行PHP 5.2

首先我只是想有充分的參考電流「index.php3」 _within_each_file_(遞歸)改爲「 index.php「,然後繼續擔心全局變量等。

K. Go!

:)

更新:非常感謝!我意識到我的問題錯過了這樣一個事實,即引用位於網站的每個文件中,我希望以遞歸方式在所有文件/文件夾中進行引用。

+0

科莫多有一個特點,要做到這一點。 – 2008-11-21 17:04:40

回答

5
find -type f -exec perl -pi -e 's/\bindex\.php3\b/index.php/g' {} \; 
2

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

假設你正在使用UNIX類操作系統。

+0

還有一個與GNU sed - 這不適用於非GNU版本的sed。 – 2008-11-21 04:07:24

+0

Minor nitpick,@Jonathan - 如今你很難找到沒有GNU sed的UNIX。 – paxdiablo 2008-11-21 04:23:25

+0

找到一個類似Unix的系統,運行PHP,但沒有sed的GNU版本:) – 2008-11-21 04:42:37

4

如何:

for file in *.php3 
do 
    sed 's/\.php3/.php/g' $file > ${file%3} 
done 

的供/ DO /完成循環涉及依次在每個.php3文件,編輯文件,並替換.php每個字符串.php3,並從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文件名處理的奧祕。

1

要遞歸執行此操作,請使用Jonathan的答案,但將* .php3替換爲find . -type f。請注意,反標記很重要,您可以將任何目錄替換爲「。」。 (即當前目錄)。這裏是一個版本,它也會重命名進程中的文件(* .php3 - > * .php)。

#!/bin/bash 
for file in `find . -type f` 
do 
    sed 's/\.php3/\.php/g' $file > ${file//3/} 
    rm $file 
done 
相關問題