最近一直在做XOOPS的模块,老实说,以前没接触过PHP,也没进行过类似的接口开发,什么标准一概不知,时间又紧,写来全是随意,想到哪写到哪。居然还弄了出来。
可是客户又提了新要求,要求重用模块,就是一个模块装两次用作不同作用,我本来以为蛮简单,试了下才知道,同一模块安装多个在xoops中是有专有叫法的,这个叫法就是模块克隆。我本以为数据库表名改掉,模板文件名改掉就好了,可是改完才发现不行。不知什么地方还有冲突。
网上查了下,一般都是手动改,可是一个模块十几个文件夹,每个文件夹下又有1-20个不等的文件,每个php文件中几十到几百行不等,说不定还有文件夹,改来实在费劲。
于是用python写了个小程序来跑,目的就是递归修改文件夹名、文件名、文件内容中的指定字符串,用新的去重写。写完试了下,成功。
针对特殊用途,所以文件内容只支持文本格式
import os
import re
def _rename(old,new):
new2=''
for i in range(0,len(new),2):
a=new[i:i+2]
if a!='\xa1@':
new2+=a;
print 'new name =',new2
print 'old name =',old
if new2!=old:
print 'begin to rename',old,new2
try:
os.rename(old,new2)
except WindowsError,e:
if str(e)=='[Error 183] ':
print 'already have ',new2
else:
print str(e)
def excuepath(p,oldname,newname):
#传递路径及两个字符串作为参数
workdir=p
os.chdir(workdir)
cwd=os.getcwd()
dirs=os.listdir(cwd)
old=oldname
new=newname
for tmp in dirs:
path=os.path.join(cwd,tmp)
print 'path=',path
#如果是文件,修改内容后重命名
if os.path.isfile(path):
#自己内部的字符串不要替换
if tmp[-3:]!='.py':
data = open(path).read()
#print data
data = re.sub(old,new, data)
open(path, 'wb').write(data)
newpath=path.replace(old,new)
_rename(path,newpath)
#如果是路径,重命名后递归
elif os.path.isdir(path):
newpath=path.replace(old,new)
_rename(path,newpath)
excuepath(newpath,old,new)
if __name__=='__main__':
old='someString'
new='newString'
excuepath(os.path.abspath('.'),old,new)