ну хорошую утилиту трудно сделать. Что вы хотите от символьных ссылок мне непонятно.
#! /bin/env/python
# -*- coding:utf-8 -*-
u""" As unix rename but regular expression syntax"""
import argparse
import shutil,os
import re
# парадигма - разработка через тестирование
def mk_fil(data):
with open("a.dat","w") as f:
f.write(str(data))
return "a.dat"
def make_test_dir():
os.renames(mk_fil(1),"aaa/a1.dat")
os.renames(mk_fil(2),"aaa/a2.dat")
os.renames(mk_fil(3),"aaa/bbb/a3.dat")
os.renames(mk_fil(3),"aaa/bbb/a4.dat")
os.renames(mk_fil(3),"aaa/bbb/4a.dat")
def test_rrename_nr():
make_test_dir()
try:
rrename(ur"([a-z]+)(\d+)",ur"\2\1","aaa")
assert(os.path.exists("aaa/1a.dat") and
os.path.exists("aaa/2a.dat") and
os.path.exists("aaa/bbb/a3.dat") and
os.path.exists("aaa/bbb/a4.dat")
)
finally:
shutil.rmtree("aaa")
def test_rrename_r():
make_test_dir()
try:
rrename(ur"([a-z]+)(\d+)",ur"\2\1","aaa",recursive=1)
assert(os.path.exists("aaa/1a.dat") and
os.path.exists("aaa/2a.dat") and
os.path.exists("aaa/bbb/3a.dat") and
os.path.exists("aaa/bbb/4a.dat") and
os.path.exists("aaa/bbb/a4.dat")
)
finally:
shutil.rmtree("aaa")
def test_rrename_rf():
make_test_dir()
try:
rrename(ur"([a-z]+)(\d+)",ur"\2\1","aaa",recursive=1,force=1)
assert(os.path.exists("aaa/1a.dat") and
os.path.exists("aaa/2a.dat") and
os.path.exists("aaa/bbb/3a.dat") and
os.path.exists("aaa/bbb/4a.dat") and
not os.path.exists("aaa/bbb/a4.dat")
)
finally:
shutil.rmtree("aaa")
# символьные ссылки лениво тестировать
# собственно код
def file_iter(root,recursive=False,symlinks=False):
if recursive:
for di, dl, fl in os.walk(root,followlinks=symlinks):
for f in fl:
yield os.path.join(di, f)
else:
di, dl, fl = os.walk(root).next()
for f in fl:
yield os.path.join(di, f)
# интерфейс для программного использования
def rrename(src,target,root=".", force=False, recursive=False, symlinks=False):
ex = re.compile(src)
ifail = 0
for oldname in file_iter(root,recursive,symlinks):
newname, n = ex.subn(target,oldname)
if n:
if force and os.path.exists(newname):
os.remove(newname)
try:
os.rename(oldname,newname)
except OSError:
ifail+=1
print "fail rename {0} -> {1}".format(oldname,newname)
return ifail
# интерфейс для консоли
if __name__ == '__main__':
parser = argparse.ArgumentParser(prog="rrename",description="rename files by regular expression replace")
parser.add_argument("-r","--recursive",action='store_true',help=u"search files in subdirs")
parser.add_argument("-f","--force",action='store_true',help=u"force file overwrite")
parser.add_argument("-s","--symlinks",action='store_true',help=u"follow symlinks")
parser.add_argument("-d","--directory",help=u"root directory")
parser.add_argument("patterns",nargs="2",help=u"input_pattern output_pattern")
args = parser.parse_args()
root = args.directory
if not root:
root = "."
sys.exit(rrename(args.patterns[0],args.patterns[1],root,args.force,args.recursive,args.symlinks))