Проблема состоит из следующих частей:
- Найти все фотографии в
Photos-Mod
каталоге - Найдите каждое соответствующее фото под
Photos-Orig
- Вызвать
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 и без использования exiftools
GNU 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.)