![Linux에서 이미지 이름을 일괄적으로 바꾸고 싶습니다.](https://linux55.com/image/145342/Linux%EC%97%90%EC%84%9C%20%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%9D%BC%EA%B4%84%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EA%B3%A0%20%EC%8B%B6%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
이름이 지정된 이미지가 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
이름 바꾸기 구성표가 원하는/예상한 것인지 확인하기 위해 첫 번째 실행에서 주석 처리(또는 로 대체)할 수 있습니다 .
셸 모드 및 문자열 조작에 대한 지침은 다음을 참조하세요. 배쉬 패턴 매칭그리고Bash 문자열 조작.