Crie link simbólico de forma recursiva para imagens com nome de arquivo exclusivo, embora o timestamp não seja suficiente

3

As fotos das minhas câmeras ( .CR2 ou .JPG ) têm data exif correta + tempo, mas apenas em segundos, infelizmente não em milissegundos. Portanto, algumas fotos têm o mesmo valor date_time (gravado no mesmo segundo). As fotos são salvas em subpastas, razão pela qual a criação de nomes de arquivos exclusivos (além de todas as pastas) apenas por date_time não é possível com o exiv2. Exemplo de situação inicial:

Folder 1 / 2016_12_01_1326.JPG
Folder 1 / 2016_12_02_1830.CR2
Folder 2 / 2016_12_01_1326.JPG (same date, hours, and seconds but not milliseconds)

Eu gostaria de criar links simbólicos com um nome exclusivo para todas as minhas fotos. Minha idéia para resolver esse problema é converter os nomes de arquivos das fotos em data-hora com exiv4 e os links simbólicos com o mesmo nome, além de um número em andamento.

Então, finalmente, o resultado dos links simbólicos deve ser, por exemplo:

2016_12_01_1326_0001.JPG
2016_12_01_1326_0002.JPG
2016_12_02_1830_0003.CR2

Minha abordagem é a seguinte, mas não funciona com o número em andamento:

f=$(pwd);
export f;
var=0; export var;
find 2016/. \( -name "*.CR2" -o -name "*.JPG" \) -execdir sh -c 'ln -s "$PWD"/$(basename {}) "$f"/2016_Links/Pictures/Link_"$((var++))"_$(basename {})' {} \;

O $((var++)) não está funcionando devido ao seguinte erro:

./20160312_09_02_42.CR2: 1: ./20160312_09_02_42.CR2: arithmetic expression: expecting primary: "var++"
    
por CR500 20.12.2016 / 12:16

1 resposta

2

O problema na questão é que "var" é incrementado em um subshell iniciado por '-execdir', então o shell pai não obtém o valor alterado. Nesse caso, você não pode usar o recurso Localizar para fazer todo o trabalho para você, pois o rastreamento não acompanha o progresso.

Aqui está a solução que inclui o nome do link desejado e o que você quase usou no comando find, experimente e use o que você gosta.

export var=0
for F in $(find 2016 \( -name "*.CR2" -o -name "*.JPG" \)); do
    FL=${F##*/}
    echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/${FL%.*}_$(printf "%04d" $((var++))).${FL##*.}"
# or
    echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/Link_$((var++))_${F##*/}"
done

Editar: No caso de nomes que contenham espaços, primeiro de todas as citações são uma obrigação, então uma pequena mudança para um loop diferente deve fazer o truque:

export var=0
find 2016 \( -name "*.CR2" -o -name "*.JPG" \) | while read F; do
    FL=${F##*/}
    echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/${FL%.*}_$(printf "%04d" $((var++))).${FL##*.}"
    # or
    echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/Link_$((var++))_${F##*/}"
done
    
por 21.12.2016 / 01:44