有个小需求, 给了一大堆有规则的文件, 在不同的文件夹下, 根据已有的规则替换成另外的文件。比如 p01.jpg => p-0-3.jpg p02 => p-0-3.jpg
目录结构如下
1 2 3 4 5 6 7 8 9 10 11 12 13 /tmp /tmp |-01/ |-01/ |-p01.jpg |-p-0-1.jpg |-p02.jpg |-p-0-2.jpg |-02/ |-02/ |-p01.jpg ===> |-p-0-1.jpg |-p02.jpg |-p-0-2.jpg |-03/ |-03/ |-p01.jpg |-p-0-1.jpg |-p02.jpg |-p-0-2.jpg ....
最开始想到的是用bash来处理这些玩意, 应该很简单, 于是就开始写了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 OLDN=(p01.jpg p02.jpg) NEWN=('p-0-1.jpg' 'p-0-2.jpg' ) pathDir="/tmp" for index in ${!OLDN[@]} do value=${OLDN[$index]} pattern="*${value} " for file in `find $pathDir -name "${pattern} " ` do newfile=$(echo $file | sed -n "s/${value} /${NEWN[$index]} /p" ) mv $file $newfile done done
使用python吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 from glob import globfrom pathlib import Pathimport shutildirpath = "e:/tmp/" filemap = { "p01" : "p-0-1" , "p02" : "p-0-2" , "副本" : "fb-1" } def get_ext (filename ): if '.' not in filename: return '' return filename.rsplit('.' , 1 )[1 ] def batch_rename (): for srcfile in filemap: distfile = filemap.get(srcfile) filepath = Path(dirpath).joinpath("**/*" + srcfile + "*" ) paths = glob(str (filepath), recursive=True ) for matchfile in paths: matchfile_path = Path(matchfile) newfile = matchfile_path.parent.joinpath(distfile + "." + get_ext(matchfile)) print (matchfile, newfile) shutil.copyfile(matchfile, newfile) if __name__ == '__main__' : batch_rename()
PS: 貌似真的很简单, 有bug, 如有如果有中文字符串的时候, 会匹配不上。 待续….