O problema consiste nas seguintes partes:
- Encontre todas as fotos no diretório
Photos-Mod - Encontre cada foto correspondente em
Photos-Orig - Invoque
exiftoolscom argumentos corretos
Encontrar todas as fotos
Isso é fácil usando uma expressão glob como ~/Photo-Mod/*/* .
Encontrando a foto correspondente
Dado um caminho completo, podemos substituir o Photo-Mod por Photo-Orig . Além disso, alteramos a extensão do arquivo para * , para que tenhamos outra expressão glob. Se essa glob não corresponder a nenhum arquivo, imprimiremos uma mensagem de erro, mas simplesmente continuaremos.
Invocando exiftools agora é fácil.
Uma solução de bash
Recapitulação rápida da sintaxe de Bash:
-
Foreach-loops:
for variable in EXPR; do COMMANDS; done -
If-else:
if COND; then COMMANDS; else COMMANDS; fi -
Filetests:
[ -e $file ](-etestes para a existência de arquivos)
Atribuições de variáveis -
:
var=$(COMMANDS).
Podemos usar expressões regulares via 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
Isso pode ser executado diretamente na linha de comando, removendo todas as novas linhas. Você também pode colocá-lo em um shell script e chamá-lo de lá.
( Nota: testado com expressões glob semelhantes e sem exiftools na bash do GNU)
Uma solução Perl
Introdução rápida à sintaxe do Perl:
-
Foreach-loops:
for my $variable (LIST) { COMMANDS } -
If-else:
if (COND) { COMMANDS } else { COMMANDS } -
Filetests:
-e $filename
Atribuições de variáveis -
:
my $var = EXPR;
As expressões regulares fazem parte do idioma e podem ser aplicadas por $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";
}
}
Você pode despejar o código em um arquivo e invocá-lo com perl script.pl . Ou você pode usar um aqui-doc:
$ perl <<'END'
# The code goes here
END
( Nota: Os scripts em Perl foram testados com perls v16.3 e v14.2 no Linux.)