У меня есть тонна файлов, все имена, такие как 1.jpg, 2.jpg, 3.jpg и т. д. до 1439.jpg, однако у меня проблема с одним из моих проектов и алфавитом. Обычно это идет в порядке 1.jpg, 10.jpg, 11.jpg и т. Д.
Что мне нужно, так это назвать файлы так, чтобы они были в формате, таком как 00001.jpg вплоть до 01439.jpg.
Как я смогу сделать это быстро и эффективно?
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then mv $f `printf "%.5d" "${f%.*}"`.jpg ; fi ; done
Редактировать
Объяснение:
if [[ $f =~ [0-9]+\. ]] позволяет переименовывать только файлы, имена которых являются числами (за ними следует точка). printf "%.5d" NUMBER добавляет, что ведущие нули "${f%.*}" разрезают расширение (.jpg) и оставляют только число .jpg после того, как второй backtick добавляет расширение файла снова.Обратите внимание, что это будет работать только с именами файлов, которые являются числами.
Если вы хотите поэкспериментировать, попробуйте эту команду:
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg ; fi ; done
Изменить [ ! d10]
Сделал команду более безопасной, убедившись, что только имена файлов, которые являются числами, переименовываются. Обратите внимание, что все ранее существовавшие файлы с именем 00001.jpg будут перезаписаны.
Ниже сценария python.
Сценарий добавляет ведущие нули до определенного количества цифр. Если имя больше этого, файл (имя) не тронут.
Объединение разных расширений в одно действие переименования может добавить некоторое удобство. Чтобы добавить расширения (ы), просто добавьте их в кортеж, например extensions = (".jpg", ".jpeg", ".tiff").
Скопируйте текст в пустой файл, сохраните его как rename.py, введите правильный путь в каталог файлов (sourcedir), количество цифр, которое вы хотели бы, чтобы новые имена имели (number_ofdigits) и расширение файла (ов) для переименования (extensions)
Запустить его командой :
python3 /path/to/script/rename.py
Сценарий:
#!/usr/bin/python3
import shutil
import os
sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")
files = os.listdir(sourcedir)
for item in files:
if item.endswith(extensions):
name = item.split("."); zeros = number_ofdigits-len(name[0])
newname = str(zeros*"0")+name[0]+"."+name[1]
shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)
edit:
Ниже немного улучшенной версии. Он автоматически определяет самое длинное имя в каталоге и добавляет ведущие нули до длины самого длинного имени.
пример:
1.jpg
12.jpg
123.jpg
становится:
Не нужно указывать количество цифр.
#!/usr/bin/python3
import shutil
import os
sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))
for item in files:
zeros = maxlen-len(item[2])
shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])
В Perl есть утилита переименования, которая делает это очень просто:
rename 's/\d+/sprintf("%05d",$&)/e' *.jpg
Первый аргумент - это выражение Perl, которое оценивается для каждого имени файла.
Существует GUI, который будет делать это под названием pyRenamer, который можно найти в репозиториях. Установите, запустите, выберите свой каталог и просто установите «Переименованный шаблон имени файла» на «{num5}» на вкладке «Шаблоны» и нажмите кнопку «Переименовать». Вы также можете просмотреть, что произойдет до переименования.
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`
do
mv $file "000"$file
done
Это грубо, поскольку он не делает переименование разумно, нужно будет подумать об этом.
Update: Ну, у вас есть более полный ответ.