Переименование сотен файлов одновременно для правильной сортировки

У меня есть куча файлов со всеми именами, например, 1.jpg, 2.jpg, 3.jpg и т. Д. До 1439.jpg, однако у меня есть проблема с одним из моих проектов и алфавитным алфавитом. Обычно это происходит в порядке 1.jpg, 10.jpg, 11.jpg и т. Д.

Мне нужен какой-то способ именования файлов, чтобы они были в формате, например, 00001.jpg, вплоть до 01439.jpg.

Как бы я мог сделать это быстро и эффективно?

23
задан 30 July 2014 в 19:00

6 ответов

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
35
ответ дан 30 July 2014 в 19:00
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.

0
ответ дан 30 July 2014 в 19:00

Ниже сценария 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])
6
ответ дан 30 July 2014 в 19:00

Существует переименовать утилита, реализованная в Perl, который делает это очень легким:

rename 's/\d+/sprintf("%05d",$&)/e' *.jpg

Первым аргументом является выражение Perl, которое оценено для каждого имени файла.

2
ответ дан 30 July 2014 в 19:00

Существует GUI, который сделает названный pyRenamer, который может быть найден в репозиториях. Установка, запустите, выберите свой каталог и просто установите 'Переименованный шаблон имени файла' на '{num5} 'на вкладке 'Patterns' и нажмите кнопку 'Rename'. Можно ли также предварительно просмотреть то, что произойдет до переименования.

0
ответ дан 30 July 2014 в 19:00
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

Это сыро, так как это не делает переименования разумно, должен будет думать о приеме для этого. Но это должно помочь Вам материал вида.

Обновление: Хорошо у Вас есть более полный ответ.

0
ответ дан 30 July 2014 в 19:00

Другие вопросы по тегам:

Похожие вопросы: