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 único. 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 uma maneira de renomear em lote os arquivos em uma série de subdiretórios usando, digamos, comandos de terminal?

EDITAR

A resposta Aqui e obteve o seguinte resultado no 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 pegou

stat: opção ilegal - c uso: stat [-FlLnqrsx] [-f formato] [-t timefmt] [arquivo ...]   stat: opção ilegal - c uso: stat [-FlLnqrsx] [-f formato] [-t timefmt] [arquivo ...]   stat: opção ilegal - c uso: stat [-FlLnqrsx] [-f formato] [-t timefmt] [arquivo ...]

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

geordie
fonte
Você já tentou alguma coisa?
suspectus
"mas não vai funcionar em Darwin .." Por que você diz isso? O que você tentou exatamente e quais foram os resultados?
Ƭᴇcʜιᴇ007
Eu estou realmente em um final solto com isso. Por favor, poste uma resposta se você souber como isso seria feito. Obrigado.
geordie
1
O Graphic Converter (shareware, não gratuito, mas pode ter uma avaliação gratuita) tem algumas opções de renomeação. Eu uso isso o tempo todo para gerenciar minhas fotos digitais. Se você não é um programador, eu tentaria obter uma ferramenta que faz isso para você. (EU sou um programador, e eu ainda uso o "GC" para esse tipo de coisa!
jimtut

Respostas:

2

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, renomeando-os para um nome exclusivo (por exemplo, o nome do diretório .jpg sufixo)

    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 são sempre nomeados da mesma maneira, mas existe apenas um único arquivo (com nome terminando em .jpg ) no subdiretório, você pode substituir o mv comando com:

      mv ${i}*.jpg ./`basename $i`.jpg
    
  • em seguida, 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: http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

Ale
fonte
Estou tendo o erro a seguir: mv: rename ff76e77ec7438371b42fc5027ad00486//orig.jpg to ./.jpg: No such file or directory
geordie
Ah ... não considerou que os nomes dos diretórios acabariam com /, estava trabalhando no Linux, mas não necessariamente no MacOS ... atualizado com uma versão melhorada. Eu não tenho um Mac por aí agora para testar, infelizmente.
Ale
btw você verificou se ff76e77ec7438371b42fc5027ad00486/orig.jpg realmente existe?
Ale
Sim, eu verifiquei. Parece haver um problema de sintaxe com seu novo código editado. ele tenta encontrar dirname/dirname.jpg e diz que não existe tal arquivo. Pode precisar de alguém com um mac para testar corretamente. Obrigado por tentar.
geordie
Você está usando o bash como um shell?
Ale
1

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 de 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 isto:

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 estiverem corretas, remova o echo e executá-lo novamente para realmente renomear os arquivos. Como eu disse, não posso testar isso já que não tenho acesso a uma máquina OSX, então você pode ter que ajustá-lo. Dê uma olhada nas páginas man que eu criei link (ou execute man stat na sua máquina). Eu não tenho certeza que OSX date pode lidar com a saída de stat -f '%m'se não, avise-me e eu tentarei ajudar.

Explicação

  • find . -name orig.jpg : recursivamente encontrar 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, execute 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. Desde que estamos dando a saída de stat -f '%m' $file, que imprimirá a data em que o arquivo foi modificado.
  • mv "$file" "$(date -jf "$(stat -f '%m' $file)" +%Y%m%d_%H%M%S)".jpg : renomear $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
terdon
fonte