Какой инструмент использовать для этого регулярного выражения

Я использую комбинацию Automator, Bash и Exiftool, чтобы взять такие имена файлов: 0615090217.jpg и изменить дату создания на 2009:06:15 02:17:00.

Большинство частей головоломки работают, у меня даже есть рабочее регулярное выражение, я просто не знаю, как применить его с помощью bash или какой-либо комбинации других инструментов. Я видел, как предлагается sed, но я не знаю, как его применить.

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

  • Выражение: /(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.*)\.[^.]+$/g

  • Замена: \n20$3:$1:$2 $4:$5:00\n\t

  • Текст: 0615090217.jpg

Сценарий оболочки в моем рабочем процессе Automator выглядит так:

for f in "$@"
do
  FILENAME=$(basename "$f")
  MYDATE='2010:07:09 12:22:00'
  /usr/local/bin/exiftool -overwrite_original_in_place -preserve "-AllDates=${MYDATE}" "$f"
done

Я хочу заменить MYDATE датой, извлеченной из имени файла, используя мое регулярное выражение или какой-либо другой метод. Я чувствую, что близок, это просто соединение последних точек.


person bookcasey    schedule 04.01.2016    source источник
comment
Я предлагаю спросить на Обмене стеками рекомендаций по программному обеспечению   -  person Cyrus    schedule 04.01.2016
comment
Вы действительно спрашиваете, какой инструмент использовать, или вы спрашиваете, как исправить ваш сценарий bash, чтобы он изменял формат даты для использования с exiftool?   -  person ghoti    schedule 04.01.2016


Ответы (2)


Если вы используете OSX, FreeBSD, NetBSD и т. Д., То команда date позволяет легко конвертировать из одного формата в другой:

#!/usr/bin/env bash

for f in "$@"
do
  FILENAME=$(basename "$f")
  MYDATE=$(date -j -f '%m%d%y%H%M.jpg' "$FILENAME" '+%Y-%m-%d %H:%M:00')
  /usr/local/bin/exiftool \
    -overwrite_original_in_place \
    -preserve "-AllDates=${MYDATE}" \
    "$f"
done

Вы также можете добиться этого, разорвав имя файла, используя bash "Parameter Expansion", но это требует большего набора текста.

person ghoti    schedule 04.01.2016
comment
Действительно близко! Я заметил еще одну ошибку, даты с 2010 года почему-то похожи на 0709011222.jpg, 01 в% y. Есть идеи, как быстро это исправить? В любом случае я отмечу, что это принято, но это будет действительно полезно. - person bookcasey; 04.01.2016
comment
@bookcasey, можно ли предположить, что у вас никогда не будет файлов с датами 2001 года? (Обратите внимание, что это ошибка в любом процессе, генерирующем ваши имена файлов, а не в приведенном выше сценарии. Вы запрашиваете обходной путь в сценарии, который поможет вам справиться с ошибкой в ​​процессе создания файла.) - person ghoti; 04.01.2016

Exiftool может сделать это самостоятельно. Нет необходимости в сценариях, так как это просто замедлит весь процесс, потому что он будет вызывать exiftool для каждого файла.

Попробуйте что-нибудь вроде:
/usr/local/bin/exiftool -overwrite_original_in_place -preserve '-AllDates<${Filename;s/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.*)\.[^.]+$/20$3:$1:$2 $4:$5:00/}' DIR

Я просто поднял ваше регулярное выражение и вставил его, так что сначала проверьте его, конечно. Мой быстрый тест здесь сработал правильно, результат ниже.

c:\>exiftool -g1 -alldates X:\!temp\0615090217.jpg
---- IFD0 ----
Modify Date                     : 2012:08:30 22:25:33
---- ExifIFD ----
Date/Time Original              : 2013:18:08 19:04:15
Create Date                     : 2012:08:30 22:25:33

c:\>exiftool "-AllDates<${Filename;s/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.*)\.[^.]+$/20$3:$1:$2 $4:$5:00/}" X:\!temp\0615090217.jpg
1 image files updated

c:\>exiftool -g1 -alldates X:\!temp\0615090217.jpg
---- IFD0 ----
Modify Date                     : 2009:06:15 02:17:00
---- ExifIFD ----
Date/Time Original              : 2009:06:15 02:17:00
Create Date                     : 2009:06:15 02:17:00
person StarGeek    schedule 05.01.2016
comment
Отлично! +1 за лучшее знание инструментов! :-) - person ghoti; 05.01.2016