Renomeando arquivos .jpg em subdiretórios sem alterar a data de criação (em um MAC)

2

Eu tenho um monte de arquivos JPEG com exatamente o mesmo nome (ou seja, "orig.jpg"), cada um em um subdiretório separado. Cada subdiretório tem um nome exclusivo (por exemplo, xplmz3nc5n, tyrn5m6ktv, etc ...).

Quero renomear os jpegs com base na data / hora de criação deles (por exemplo, 20120629_142536.jpg, etc.).

Consegui usar o photoshop para renomear cada arquivo com um identificador exclusivo. O principal recurso que permitiu isso foi a capacidade do Photoshop de "incluir todos os subdiretórios" em um processo em lote. Eu estava esperando poder então usar exiftool para renomear os arquivos para incluir a data de criação (para facilitar a catalogação). Infelizmente, o processo de renomeação de lote do photoshop reescreve a data de criação do arquivo para a data de hoje ...

Alguma sugestão sobre como renomear os arquivos em uma série de subdiretórios usando, por exemplo, comandos de terminal?

EDITAR

A resposta aqui e obteve o seguinte resultado em Terminal

cd ~/foo
for dir in *; do 
    t='stat -c %y "$dir" | awk '{print $1"-"$2}' | 
       cut -d ":" -f 1,2 | sed 's/://''
    mv "$dir" "$t"_"$dir";
done

e obtivemos

stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...] stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...] stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]

(por exemplo, tentei dois métodos diferentes ...).

    
por geordie 09.01.2015 / 14:04

2 respostas

1

Uma possibilidade usando a data de criação do EXIF seria (não testada, mas deveria funcionar):

  • mova todos os seus arquivos para o mesmo diretório, renomeie-os para um nome exclusivo (por exemplo, o nome do diretório que contém mais o sufixo .jpg )

    cd ~/foo
    for i in */; do
      # moves the file (supposedly named orig.jpg) in current directory
      # renaming it to the name of the containing sub directory
      mv ${i}orig.jpg ./'basename $i'.jpg
      # removes the subdirectory, assuming it is now empty
      rmdir $i;
    done
    

    Se os arquivos não forem sempre nomeados da mesma maneira, mas houver apenas um único arquivo (com o nome terminando em .jpg ) no subdiretório, é claro que você pode substituir o comando mv por:

      mv ${i}*.jpg ./'basename $i'.jpg
    
  • renomeie-os usando exiftool :

    exiftool -d %Y%m%d_%H%M%S.jpg "-filename<CreateDate" ~/foo
    

    Isso pressupõe que nenhum arquivo terá o mesmo tempo de criação até o nível de segundos. Se houver risco de colisão de nome de arquivo, você poderá usar uma variante que adicione um sufixo ao nome do arquivo no caso de um nome duplicado:

    exiftool -d %Y%m%d_%H%M%S%-c.jpg "-filename<CreateDate" ~/foo
    

Mais informações sobre a função de renomeação de exiftool aqui: link

    
por 09.01.2015 / 23:52
0

Infelizmente, o OSX não possui as ferramentas GNU, mas, em vez disso, seus principais utilitários são garfos das versões do BSD. Isso significa que muitas respostas da linha de comando encontradas para o Linux não serão aplicadas. Ou porque as opções relevantes estão faltando ou porque são diferentes.

Eu não tenho uma máquina OSX para testar isso, mas com base nas páginas de manual do OSX para stat e date , isso deve fazer o que você precisa:

find . -name orig.jpg | 
    while read file; do
     echo mv "$file" "$(date -jf "$(stat -f '%m' "$file")" +%Y%m%d_%H%M%S)".jpg
    done

Se os nomes dos diretórios puderem conter espaços ou outros caracteres estranhos, use isso:

find . -name orig.jpg -print0 | 
    while IFS= read -r -d '' file; do
     echo mv "$file" "$(date -jf "$(stat -f '%m' $file)" +%Y%m%d_%H%M%S)".jpg
    done

Isso apenas imprimirá os comandos que serão executados. Se eles estiverem corretos, remova o echo e execute-o novamente para realmente renomear os arquivos. Como eu disse, não posso testar isso, pois não tenho acesso a uma máquina OSX, então talvez seja necessário ajustá-lo. Dê uma olhada nas páginas de manuais às quais me vinculei (ou execute man stat em sua máquina). Não tenho certeza se o date do OSX pode lidar com a saída de stat -f '%m' , se não, avise-me e tentarei ajudar.

Explicação

  • find . -name orig.jpg : encontre recursivamente todos os arquivos chamados origin.jpg na pasta atual.
  • while read file; ... ; do : isso salvará cada um dos nomes de arquivos encontrados por find como $file e, em seguida, executará os próximos comandos em cada um deles.
  • stat -f '%m' $file : isso deve mostrar a hora da modificação do arquivo em um formato legível por humanos.
  • $(date -jf "DATE" +%Y%m%d_%H%M%S) : imprime a data dada por DATE como YYMMDD_HHMMSS. Como estamos dando a saída de stat -f '%m' $file , isso imprimirá a data em que o arquivo foi modificado.
  • mv "$file" "$(date -jf "$(stat -f '%m' $file)" +%Y%m%d_%H%M%S)".jpg : renomeie $file para a data retornada por date e .jpg .

O comando equivalente no Linux é:

find . -name orig.jpg | 
    while read file; do 
        echo mv "$file" "$(date -d "$(stat -c '%y' $file)" +%Y%m%d_%H%M%S)".jpg
   done
    
por 12.01.2015 / 17:53