有个小需求, 给了一大堆有规则的文件, 在不同的文件夹下, 根据已有的规则替换成另外的文件。比如 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

#!/bin/bash
# @author: luowen<bigpao.luo@gmail.com>
# @desc: 批量变更名称
# @time: 2018-08-30
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 glob
from pathlib import Path
import shutil

dirpath = "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, 如有如果有中文字符串的时候, 会匹配不上。 待续….