Переименование файлов по дате их изменения

У меня есть несколько (96) изображений, которые мне нужно переименовать. Каждая программа или скрипт, который я использовал, автоматически сортирует файлы по старому имени, но они должны быть пронумерованы в порядке изменения даты. Пример: изображения были сняты 11 V 2015 08:13:40 и 11 V 2015 08:13:46, но 1-е имя "f67546288.jpg" и 2-е "f67553376.jpg". Их нужно заказывать не по алфавиту, а по времени, когда была сделана фотография.

PS Извините за мой английский, но я польский

4 ответа

  1. Установить exiftool

  2. Используйте его для переименования файлов в соответствии с информацией exif на изображении. Пример:

    for f in "$@"
    do
        exiftool -ext jpg -d %Y%m%d_%H%M%S%%+c.%%le "-filename<CreateDate" "$f"
    done
    

Отрегулируйте формат имени выходного файла в соответствии с.

Вы можете использовать метку времени модификации в секундах с начала эпохи

Время Unix (также известное как время POSIX или ошибочно как время эпохи) - это система для описания моментов во времени

find . -type f -iname "*.JPG" -print0 | while read -d $'\0' file; do mv "$file" "$(stat -c %Y "$file")".jpg; done

пример

% ls -og
total 2796
-rw-r--r-- 1 2859518 Jan  2 11:26 IMG_20150102_112628_8902.JPG

% find . -type f -iname "*.JPG" -print0 | while read -d $'\0' file; do mv "$file" "$(stat -c %Y "$file")".jpg; done

% ls -og                                                            
total 2796
-rw-r--r-- 1 2859518 Jan  2 11:26 1420194390.jpg

% date -d @1420194390
Fr 2. Jan 11:26:30 CET 2015

объяснение

  • -iname "*.JPG" соответствует всем JPG без учета регистра
  • -print0 а также $'\0' Ваши имена файлов могут содержать пробелы и переводы строк

от man stat

%Y     time of last data modification, seconds since Epoch

Если ваши изображения содержат данные exif, вы можете выполнить следующие действия.

устанавливать exiftool

sudo apt-get install libimage-exiftool-perl

и вы можете использовать команду ниже:

cd <your_images_path>
exiftool '-filename<ModifyDate' -d %y%m%d_%H%M%S%%-c.%%le -r -ext jpg .

пример

% ls -og
total 2808
-rw-r--r-- 1 2859518 Jan  2 11:26 IMG_20150102_112628_8902.JPG
drwxrwxr-x 3    4096 Jun 14 12:12 source
drwxrwxr-x 2    4096 Jun 14 12:12 target

% exiftool '-filename<ModifyDate' -d %y%m%d_%H%M%S%%-c.%%le -r -ext jpg .
    3 directories scanned
    1 image files updated
% ls -og                 

total 2808
-rw-r--r-- 1 2859518 Jan  2 11:26 150102_112628.jpg
drwxrwxr-x 3    4096 Jun 14 12:12 source
drwxrwxr-x 2    4096 Jun 14 12:12 target

объяснение

  • -filename<ModifyDate означает переименовать файл изображения, используя дату и время изменения изображения.

  • -d означает "Установить формат для значений даты / времени".

  • %y%m%d_%H%M%S%%-c.%%le, используется в сочетании с -d указывает формат, который будет использоваться для даты и времени при переименовании файла. Разбиваем формат: -%y%m%d_ означает, что первая часть нового имени файла должна состоять из двух последних цифр года создания, за которым следуют месяц и день, представленные двумя цифрами. Подчеркивание _ означает вставку подчеркивания после даты в имени файла.

  • %H%M%S означает добавление часа, минуты и секунды времени создания, представленных двумя цифрами.
  • %%-c означает, что если два изображения имеют одинаковое имя файла до этого момента в процессе именования, добавьте "номер копии, который автоматически увеличивается", чтобы дать каждому изображению уникальное имя. Обратите внимание на удвоенный %% - необходимый из-за того, что называется "побег", что я не до конца понимаю. - перед "с" в действительности нет необходимости, но ставится тире перед номером копии.
  • .%%le означает сохранить оригинальное расширение имени файла, но сделать его строчным, если он изначально был прописным, хороший вариант, когда камеры настаивают на использовании JPG вместо jpg, (Если вы предпочитаете расширения в верхнем регистре, используйте.%%ue. Если вы предпочитаете сохранить исходный регистр без изменений, используйте.%%e.)
  • -ext jpg означает только переименовать файлы с jpg расширение. Чтобы переименовать все файлы изображений в исходной папке, не указывайте никаких расширений.-r означает "выполнить эту команду рекурсивно для каждого файла изображения в верхней" исходной "папке (то есть в папке, где находятся все файлы, которые нужно переименовать), а также для файлов изображений во всех подпапках исходной папки, подпапках, и так далее".

Источник

Классический способ переименования файлов заключается в использовании mv а также for петля. stat -c %y filename дает нам время последней модификации, которое совпадает с моментом создания файла. У Stat есть дата рождения файла (%w), но в большинстве случаев она не выполняется, поэтому предпочтительнее%y

for file in *.png; do mv "$file" "$(stat -c %y "$file")".png; done

Простое решение, установка программного обеспечения не требуется, и делает работу

Извлечение времени модификации из EXIF

$ find -name '[0-9][0-9]*' -type f -exec jhead -ft -n%Y%m%d_%H%M%S_%f {} +
./DCIM/103OLYMP/P5074367.JPG
./DCIM/103OLYMP/P5074367.JPG --> ./DCIM/103OLYMP/20160507_103229_P5074367.jpg
Not JPEG: ./DCIM/103OLYMP/P5074374.ORF
./DCIM/103OLYMP/P5074374.JPG
./DCIM/103OLYMP/P5074374.JPG --> ./DCIM/103OLYMP/20160507_131746_P5074374.jpg
Not JPEG: ./DCIM/103OLYMP/P5074376.ORF
Not JPEG: ./DCIM/BACKUP.HST

Вы также можете фильтровать по расширениям JPEG/JPG:

find -name '[0-9][0-9]*' -o -iname '*.jp*g' -type f -exec jhead -ft -n%Y%m%d_%H%M%S_%f {} +

Пояснения:

  • -name '[0-9][0-9]*' запретить переименование файлов, уже имеющих префикс даты ('[0-9][0-9] для учета лет и месяцев)
  • -iname '*.jp*g' применять переименование только к файлам расширения JPG/JPEG (может быть пропущено, поскольку jhead обрабатывает только поддерживаемые файлы)
  • %f сохранить оригинальное имя файла
Другие вопросы по тегам