У меня есть куча файлов со всеми именами, например, 1.jpg
, 2.jpg
, 3.jpg
и т. Д. До 1439.jpg
, однако у меня есть проблема с одним из моих проектов и алфавитным алфавитом. Обычно это происходит в порядке 1.jpg
, 10.jpg
, 11.jpg
и т. Д.
Мне нужен какой-то способ именования файлов, чтобы они были в формате, например, 00001.jpg
, вплоть до 01439.jpg
.
Как бы я мог сделать это быстро и эффективно?
Ubuntu идет с названным сценарием rename
. Это - просто немного сценария Perl, что функции много мощных переименовывающих объем функций, но лучшей (в этом случае) является способность к нему для выполнения Perl во время замены. Результатом является действительно компактное решение:
rename 's/\d+/sprintf("%05d", $&)/e' *.jpg
Это подобно другому printf
- разработайте ответы здесь, но это все обрабатывается для нас. Код выше для 5-разрядного числа (включая переменное количество начальных нулей).
Это будет искать и заменять первую числовую строку, которую это находит с дополненной нулем версией и остальной частью отпуска имени файла один. Это означает, что Вы не должны волноваться слишком много о переносе никакого расширения или префикса.
Примечание: это не абсолютно портативно. Много использования дистрибутивов rename.ul
от util-linux
пакет как их значение по умолчанию rename
двоичный файл. Это - значительно чахлая альтернатива (см. man rename.ul
) который не поймет вышеупомянутое. Если Вы хотели бы это на платформе, которая не использует Perl, переименовывают, узнают, как установить это сначала.
И вот тестовая обвязка:
$ touch {1..19}.jpg
$ ls
10.jpg 12.jpg 14.jpg 16.jpg 18.jpg 1.jpg 3.jpg 5.jpg 7.jpg 9.jpg
11.jpg 13.jpg 15.jpg 17.jpg 19.jpg 2.jpg 4.jpg 6.jpg 8.jpg
$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg
$ ls
00001.jpg 00005.jpg 00009.jpg 00013.jpg 00017.jpg
00002.jpg 00006.jpg 00010.jpg 00014.jpg 00018.jpg
00003.jpg 00007.jpg 00011.jpg 00015.jpg 00019.jpg
00004.jpg 00008.jpg 00012.jpg 00016.jpg
И пример префиксы (мы не делаем ничего различного):
$ touch track_{9..11}.mp3 && ls
track_10.mp3 track_11.mp3 track_9.mp3
$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3 track_10.mp3 track_11.mp3
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
после того, как вторая обратная галочка добавляет расширение файла снова. Примечание, что это будет работать только над именами файлов, которые являются числами. Лево-дополнение продвижения обнуляет в непронумерованные файлы, потребовал бы другого формата.
, Если Вы хотите экспериментировать, пробуют эту команду:
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg ; fi ; done
Редактирование 2
Сделанный командой, более безопасной путем проверки, что только имена файлов, которые являются числами, переименовываются. Обратите внимание, что будут перезаписаны любые существующие ранее файлы, названные как 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)
править:
Ниже немного улучшенной версии. Это автоматически определяет самое длинное имя в каталоге и добавляет начальные нули до длины самого длинного имени.
пример:
1.jpg
12.jpg
123.jpg
становится:
001.jpg
012.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} 'на вкладке 'Patterns' и нажмите кнопку 'Rename'. Можно ли также предварительно просмотреть то, что произойдет до переименования.
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`
do
mv $file "000"$file
done
Это сыро, так как это не делает переименования разумно, должен будет думать о приеме для этого. Но это должно помочь Вам материал вида.
Обновление: Хорошо у Вас есть более полный ответ.