Массовая миграция данных EXIF ​​GPS (иначе Escape from iPhoto)

1062
Ben Gross

Я пытаюсь переместить свою библиотеку фотографий (более 12000) из iPhoto для использования в Adobe Lightroom и хотел бы добавить данные GPS, которые я добавил к фотографиям, с помощью функции iPhoto, встроенной в приложение (эти данные хранятся в частной собственности Apple база данных, а не как метаданные на самой фотографии). Я могу передать данные путем экспорта, но я хочу оригинальные файлы RAW, которые iPhoto не будет изменять. Итак, мое предлагаемое решение заключается в следующем:

1) Экспортируйте все оригинальные фотографии RAW в дерево каталогов, отсортированное по имени события. 2) Экспортируйте все фотографии в формате JPEG с данными GPS, встроенными в данные EXIF ​​(как iPhoto может сделать). 3) Используйте exiftool, чтобы извлечь данные GPS из JPEG и скопировать их в соответствующий необработанный файл.

Я могу сделать № 3 по одной фотографии за раз с помощью следующей команды:

exiftool -overwrite_original_in_place -tagsFromFile ~/Photos-Mod/Event001/photo001.jpg -gps:all ~/Photos-Orig/Event001/photo001.NEF 

Файлы Photos-Mod содержат данные GPS из iPhoto, а Photos-Orig - нет. Дерево каталогов и имена файлов будут идентичны, за исключением основного имени каталога и расширения файла (в некоторых случаях мой оригинал также является jpeg). Я надеюсь, что есть хороший способ создать сценарий, который может запускать exiftool для измененных файлов iPhoto в родительском каталоге Photos-Mod, и перемещать данные GPS в исходный файл с соответствующим именем файла и каталогом событий на фотографиях. -Ориг родительский каталог.

У меня просто нет навыков написания сценариев. Любая помощь здесь будет горячей.

0
Этот вопрос слишком далеко зашёл в область «gimme teh codez plz», но я думаю, что смогу помочь вам решить проблему самостоятельно. Сначала несколько важных вопросов: ① Есть ли у вас опыт программирования (если да, в какой форме)? Это помогает ориентироваться в объяснениях. ② Можете ли вы гарантировать, что единственная разница между путями к фотографиям заключается в том, что `Mod` меняется на` Orig`, а расширение изменяется с `jpg` на` NEF`? ③ Глубина путей фотографий постоянна, или в некоторых папках событий есть подпапки, которые необходимо посетить? ④ Вы хотите использовать Perl или Bash? amon 11 лет назад 0
Amon, Полностью "дай мне кодз плз" (извините), но я приму любую помощь, которую вы можете дать в изучении, как решить мою проблему. У меня ограниченный опыт, просто практический выход. Matlab в основном и некоторые сценарии оболочки (bash). Использовал sed и grep много за последнее. Но я 10 лет без практики. Разница будет между модом и оригами, как вы сказали, и расширением, но некоторые расширения не изменятся. (некоторые из них будут .NEF> .jpg, а другие будут .jpg> .jpg) Глубина будет постоянной. Я организовываю как Photos-Orig / Year / Event001 / photo001.NEF Я больше всего знаком с Bash, ноль опыта работы с Perl. Ben Gross 11 лет назад 0

1 ответ на вопрос

0
amon

Проблема состоит из следующих частей:

  1. Найти все фотографии в Photos-Modкаталоге
  2. Найдите каждое соответствующее фото под Photos-Orig
  3. Вызвать exiftoolsс правильными аргументами

Поиск всех фотографий

Это легко с помощью выражения типа glob ~/Photo-Mod/*/*.

Нахождение соответствующей фотографии

Учитывая полный путь, мы можем заменить Photo-Modна Photo-Orig. Далее мы изменим расширение файла, *чтобы у нас было другое выражение glob. Если этот глобус не соответствует ни одному файлу, мы выводим сообщение об ошибке, но просто продолжаем.

Вызывать exiftools теперь легко.

Решение Bash

Краткий обзор синтаксиса Bash:

  • Foreach-петля:

    for variable in EXPR; do COMMANDS; done 
  • Если еще:

    if COND; then COMMANDS; else COMMANDS; fi 
  • Тесты файлов: [ -e $file ]( -eтесты на наличие файлов)

  • присвоения переменные: var=$(COMMANDS).

Мы можем использовать регулярные выражения через sed.

# There are probably more elegant ways, but I don't know much bash for mod in ~/Photo-Mod/*/*/*; do orig=$(echo $mod | sed -e 's/Photo-Mod/Photo-Orig/;s/\.[^.]*$/.*/'); orig=($orig); # Apply the glob expression, select result if [ -e $orig ]; then exiftool -overwrite_original_in_place -tagsFromFile "$mod" -gps:all "$orig"; else echo "No corresponding file for $mod found. Skipping!" >&2; fi; done 

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

( Примечание: протестировано с похожими выражениями glob и без использования exiftoolsGNU bash)

Решение Perl

Краткое введение в синтаксис Perl:

  • Foreach-петля:

    for my $variable (LIST) { COMMANDS } 
  • Если еще:

    if (COND) { COMMANDS } else { COMMANDS } 
  • Filetests: -e $filename

  • назначение переменных: my $var = EXPR;

Регулярные выражения являются частью языка и могут применяться $var =~ /REGEX/.

use strict; use warnings; # helps us write better scripts use autodie; # automatic error handling  for my $mod (glob '~/Photo-Mod/*/*/*') { my $orig = $mod; $orig =~ s/Photo-Mod/Photo-Orig/; $orig =~ s/\.[^.]*$/.*/; if (($orig) = glob qq("$orig")) { # implicitly tests for existence system 'exiftool', '-overwrite_original_in_place', '-tagsFromFile', $mod, '-gps:all', $orig; } else { warn "No corresponding file for $mod found. Skipping!\n"; } } 

Вы можете записать код в файл, а затем вызвать его с помощью perl script.pl. Или вы можете использовать здесь документ:

$ perl <<'END' # The code goes here END 

( Примечание. Скрипты Perl были протестированы с Perls v16.3 и v14.2 в Linux.)

Амон, это выглядит идеально. Протестирую и сообщу как дела! В очередной раз благодарим за помощь. Ben Gross 11 лет назад 0
Я думаю, почти получил его с помощью сценария Perl. Я вхожу в проблему с пробелами в именах событий (имеется в виду имена каталогов). Есть ли способ обойти это или я должен все переименовать? Ben Gross 11 лет назад 0
@BenGross Функция Perl `glob` разбивает данный шаблон на пустом месте на подшаблоны. Кавычки вокруг аргумента должны исправить это - я обновил свой код соответственно. У меня недостаточно глубоких знаний правил синтаксического анализа, чтобы исправить то же самое в версии bash. amon 11 лет назад 0
Ваш Perl скрипт работает как шарм! Спасибо, амон. Я пробовал qq {} в разных местах сценария, но не смог заставить его работать. Еще раз спасибо! Ben Gross 11 лет назад 0