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