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 ...).
fonte
Respostas:
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)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 omv
comando com:em seguida, renomeie-os usando
exiftool
: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:
Mais informações sobre a função de renomeação de
exiftool
Aqui: http://www.sno.phy.queensu.ca/~phil/exiftool/filename.htmlfonte
mv: rename ff76e77ec7438371b42fc5027ad00486//orig.jpg to ./.jpg: No such file or directory
ff76e77ec7438371b42fc5027ad00486/orig.jpg
realmente existe?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.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
edate
, isso deve fazer o que você precisa:Se os nomes dos diretórios puderem conter espaços ou outros caracteres estranhos, use isto:
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 executeman stat
na sua máquina). Eu não tenho certeza que OSXdate
pode lidar com a saída destat -f '%m'
se não, avise-me e eu tentarei ajudar.Explicação
find . -name orig.jpg
: recursivamente encontrar todos os arquivos chamadosorigin.jpg
na pasta atual.while read file; ... ; do
: isso salvará cada um dos nomes de arquivos encontrados porfind
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 porDATE
como YYMMDD_HHMMSS. Desde que estamos dando a saída destat -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 pordate
e.jpg
.O comando equivalente no Linux é:
fonte