O problema consiste nas seguintes partes:
- Encontre todas as fotos no diretório
Photos-Mod
- Encontre cada foto correspondente em
Photos-Orig
- Invoque
exiftools
com 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 ]
(-e
testes 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.)