我有超过 100 万张图像,名称为
love-images-250x120.jpg
7788855441122-love-images-250x120.jpg
us-wallpapers33344.jpg
77441144desktop-wallpapers.jpg
desktop-wallpapers1144141411.jpg
我想像这样重命名:
love-images.jpg
love-images-1.jpg
us-wallpapers.jpg
desktop-wallpapers.jpg
desktop-wallpapers-1.jpg
我正在使用这个脚本:
for f in [0-9]*; do mv "$f" "`echo $f | -f sed 's/^[0-9]*\W*//'`"; done
但是当两个图像具有相同名称时,此代码将停止。有什么方法可以执行此操作吗?
答案1
这可以使用 Python 按以下方式完成:
#!/usr/bin/python
import glob
import re
import os
from collections import Counter
origNames = glob.glob('*jpg')
finalNames = []
for i in origNames:
for old, new in [(r'\d+x\d+', ''), (r'\d', ''),(r'^\W+', ''),(r'-*\.-*', '.'), (r'\.jpg$', '')]:
i = re.sub(old, new, i)
finalNames.append(i)
counts = Counter(finalNames)
for s,num in counts.items():
if num > 1:
for suffix in range(1, num + 1):
finalNames[finalNames.index(s)] = s + str(suffix)
print(origNames, finalNames)
for i,j in zip(origNames, finalNames):
os.rename(i,j+".jpg")
答案2
在 Bash 中,解决方案可能如下所示:
#!/bin/bash
shopt -s extglob
for fn_old in *.jpg; do
i=0
fn_new=${fn_old##+([-0-9])} # strip leading number sequence in basename
fn_new=${fn_new/%[-0-9]*([-0-9x]).jpg/.jpg} # strip trailing number sequence in basename
while [[ -e $fn_new ]]; do # see if proposed name already exists
i=$((i+1)) # doublure counter
fn_new=${fn_new/%*([-0-9]).jpg/-$i.jpg} # try new filename with updated number
done
echo "$fn_old" -- "$fn_new"
mv "$fn_old" "$fn_new"
done
请小心mv
命令。您可能想在第一次运行时将其注释掉(或将其替换为cp
),只是为了看看重命名方案是否是您想要/期望的。
有关 shell 模式和字符串操作的说明,请参阅: Bash 模式匹配和Bash 字符串操作。