Crie link simbólico recursivamente, se o arquivo 1.JPG existir, renomeie para 1A.JPG

1

Eu tenho um script de shell para criar links simbólicos de todas as minhas fotos de um ano. As fotos são de câmeras diferentes e estão em subdiretórios.

f=$(pwd);
export f;
q="2015/";
z="2015_Links/";
find $q/. \( -name "*.CR2" -o -name "*.JPG" \) -execdir sh -c 'ln -s "$PWD"/$(basename {}) "$f"/"$z"/Link_$(basename {})' {} \;

Algumas das fotos têm o mesmo nome de arquivo, causando o erro:

ln: failed to create symbolic link ‘2015_Links/Link_IMG_1588.CR2’: File exists

Neste caso, gostaria de renomear os arquivos existentes. Por exemplo, Link_IMG_1588.CR2 to Link_IMG_1588A.CR2 .

    
por CR500 05.12.2015 / 21:03

2 respostas

1

Encontrei outra solução para o problema.

Consegui renomear minhas fotos (com find e exiv2 ) das minhas diferentes câmeras para que cada nome de arquivo seja exclusivo (número IMG + Data):

find 2015/. \( -name "*.CR2" -o -name "*.JPG" \) -execdir sh -c 'exiv2 -r':basename:_%Y%m%d_%H_%M_%S' rename $(basename {})' {} \;
    
por 13.12.2015 / 10:27
0

Estratégia:

  • Teste se o nome do arquivo de destino ideal existe.
  • Em caso positivo, tente adicionar sufixos numéricos -1 , -2 , etc.

Melhorias adicionais:

  • Use -exec … {} + em vez de -execdir … {} \; para uma leve melhora no desempenho. Você não precisa de -execdir aqui, já que está criando links absolutos.
  • Use $x (ou $1 se você mantiver … {} \; ) em vez de {} no shell interno. Nunca use {} dentro de um fragmento de shell em find -exec : que insere o nome do arquivo diretamente no shell script, portanto ele é analisado como sintaxe do shell, que se divide se o nome do arquivo contiver qualquer caractere que tenha um significado especial na sintaxe do shell . Sempre passe {} como um parâmetro separado.

Código (não testado):

find "$q/." \( -name "*.CR2" -o -name "*.JPG" \) -exec sh -c '
    for x; do
      base=$0/Link_${x##*/}; base=${base%.*}; ext=${x##*.}
      if [ -e "$target.$ext" ]; then
        suffix=1;
        while [ -e "${base}-$suffix.$ext"; do suffix=$((suffix+1)); done
      fi
      ln -s -- "$PWD/${x##*/}" "$target"
    done
  ' "$PWD/$z" {} +
    
por 14.12.2015 / 04:11