Как переименовать расширение файла в нижний регистр?
Я знаю, что этот вопрос задавался (и отвечался) раньше, но, похоже, моя ситуация уникальна, потому что у меня не может быть никакого решения для работы.
Запуск, мне нужно переименовать все мои фотографии из *.JPG
в *.jpg
,
Допустим, мне не нужен рекурсив, просто все картинки в одной папке.
Проблема, с которой я сталкиваюсь, такова:
mv: ‘P1010521.JPG’ and ‘p1010521.jpg’ are the same file
Та же проблема с переименованием, с такой командой:
rename 's/\.JPG$/.jpg/' *.JPG
P1020558.JPG not renamed: P1020558.jpg already exists
3 ответа
Это действительно просто:
Переименуйте в другое значение, отличное от другого
rename 's/\.JPG$/\.jpgaux/' *.JPG
Теперь переименуйте что-то еще в
.jpg
обратно, но на этот раз строчнымиrename 's/\.jpgaux$/\.jpg/' *.jpgaux
Демо: http://paste.ubuntu.com/8853245/
Источник: Как изменить расширение нескольких файлов из командной строки? Благодаря Chakra!
Если KasiyA прав в своем комментарии, и я думаю, что это так, проблема OP в том, что файл с таким же именем уже существует. Если это так, сценарий должен будет проверить, существует ли уже целевое имя файла (в нижнем регистре), и (только), если это так, переименовать исходный файл дополнительно (не только в нижнем регистре), чтобы предотвратить ошибку имени, например
image1.JPG
в
renamed_image1.jpg
поскольку image1.jpg
вызовет ошибку
Если это так, решение Python для переименования может быть:
#!/usr/bin/env python3
import os
import shutil
import sys
directory = sys.argv[1]
for file in [f for f in os.listdir(directory) if f.endswith(".JPG")]:
newname = file[:file.rfind(".")]+".jpg"
if os.path.exists(directory+"/"+newname):
newname = "renamed_"+newname
shutil.move(directory+"/"+file, directory+"/"+newname)
Скрипт переименовывает:
image1.JPG -> image1.jpg
но если image1.jpg
уже существует:
image1.JPG -> renamed_image1.jpg
Как пользоваться
Скопируйте скрипт в пустой файл, сохраните его как rename.py
, сделайте его исполняемым и запустите его командой:
<script> <directory_of_files>
Это работает лучше всего, я думаю, так как Perl поддерживает запуск кода в регулярном выражении
rename -n 's/(\.[A-Z]+$)/lc($1)/ge' *.*[A-Z]*
удалить -n
на самом деле переименовать файлы