Renomeia JPEGs adicionando um prefixo de acordo com a data

1

Eu tenho uma pasta com fotos tiradas com câmeras diferentes e todas essas imagens têm um conjunto de tags DateTimeOriginal EXIF correto.

Suponha uma lista de arquivos como este:

20150831_153712.jpg
IMG_5246.JPG
IMG_5247.JPG
20150902_201425.jpg

Agora, gostaria de saber como renomear esses arquivos dessa forma, com base na tag DateTimeOriginal , é claro:

001_IMG_5246.JPG
002_20150831_153712.jpg
003_IMG_5247.JPG
004_20150902_201425.jpg

Basicamente eu quero exiftool (ou um programa em lotes do Windows se isso não for possível diretamente) para ordenar a pasta inteira de JPEGs por DateTimeOriginal crescente e a operação de renomeação deve colocar um prefixo counter na frente do nome do arquivo (mantendo, assim, o nome do arquivo original).

Eu também gostaria de como fazer um comando de teste para pré-visualizar a renomeação antes que ela ocorra (para ver se algo está errado, suponho que esteja usando a tag TestName ).

    
por virtualdj 12.09.2015 / 12:44

2 respostas

1

Os itens que você deseja usar com o ExifTool são as opções -FileOrder e FileSequence , além de um pouco de Perl usando a opção de formatação avançada. A opção FileOrder classificará os arquivos com base no horário que você listar com a opção. Isso retarda o ExifTool um pouco, porque ele precisa ler cada arquivo duas vezes, mas ainda é geralmente mais rápido do que outras opções, como loopar e chamar o ExifTool para cada loop. A tag FileSequence é interna para o ExifTool e mantém o controle do número do arquivo atualmente sendo processado. Começa em 0, então teremos que adicionar 1 a ele no processamento avançado. Isso também é que vamos preencher os zeros para que seja pelo menos 3 caracteres.

Tente este comando:
ExifTool "-TestName<${FileSequence;$_=0 x(3-length($_+1)).($_+1)}_$filename" -FileOrder DateTimeOriginal DIR

Se funcionar, basta substituir -TestName por -FileName :% ExifTool "-FileName<${FileSequence;$_=0 x(3-length($_+1)).($_+1)}_$filename" -FileOrder DateTimeOriginal DIR

Para alterar o número de zeros preenchidos, altere o 3 em 3-length para o número desejado. Para alterar o número inicial, altere o 1 em $_+1 .

    
por 12.09.2015 / 19:30
1

Eu verifiquei algumas ferramentas de renomeação. O principal problema é, ferramentas como Renomear o Master e ExifTool pode acessar dados EXIF. Mas não consegui encontrar uma maneira de gerar uma lista numerada.

Então escrevi um script do PowerShell para fazer isso. Eu comentei cada linha. Deve ser fácil de entender. Basta lê-los.

A primeira coisa que tive de fazer foi pesquisar o ID de "DateTimeOriginal" então podemos usar GetPropertyItem(MyExifID) . Em segundo lugar, adicionamos todas as imagens de uma determinada pasta que realmente têm um DateTimeOriginal para uma matriz. Daqui foi fácil. Classificamos a coluna array por data, incrementamos um contador simples e construímos nosso novo nome de arquivo com o padrão 000_oldname .

Esse script não modifica nada. Ele produz apenas algo como:

Useparaverificaroqueoscriptfaria.Depoisdeverificarosresultadospossíveis,removaoindicadordecomentários#antesdalinha#Rename-Item$_[0].Fullname$newName.Apartirdeagora,oscriptrenomeiaseusarquivosdeacordo.

RenameFromExif.ps1

# Set image folder to process $strDirectory = "T:\Pictures" # Create empty array $arrSortMe = @() # Load Windows library to access EXIF data [void][Reflection.Assembly]::LoadWithPartialName("System.Drawing") # Loop through all JPGs and JPEGs in the given image folder Get-ChildItem -Path "$strDirectory\*" -Include *.jpg,*.jpeg | ForEach { # Load current image into Powershell as bitmap object $img = New-Object -TypeName system.drawing.bitmap -ArgumentList $_.FullName # Error handling for images which doesn't have the specified EXIF data Try { # Get EXIF data with ID 36867 - which is "DateTimeOriginal" $intExif = [Byte[]]$img.GetPropertyItem(36867).Value # Release image or else later we can't rename it $img.Dispose() # Convert EXIF data from byte array to string $strExif = [System.Text.Encoding]::Default.GetString($intExif, 0, $intExif.Length-1) # Convert EXIF data from string to datetime $dateExif = [DateTime]::ParseExact($strExif, 'yyyy:MM:dd HH:mm:ss', $null) # Add to multidimensional array: [0]=current_file and [1]=datetime $arrSortMe += ,@($_, $dateExif) } Catch {} } Write-host "DateTimeTaken" 't't't "New Name" 't't't "Old Fullname" # Sort array by datetime and pipe the sorted array to a foreach loop $arrSortMe | Sort-Object @{Expression={$_[1]} } | ForEach {$i=0}{ # Increment a simple counter starting with 0, so the first image gets the "1" $i++ # Format the counter to 3-digits, append an underscore followed by the old image name $newName = $i.ToString("000") + "_" + $_[0].Name # Don't rename images which already have three digits as filename start If ($_.Name -notmatch "^[\d]{3}_") { #Rename-Item $_[0].Fullname $newName } # Only for debugging Write-host $_[1].Date 't $newName 't $_[0].Fullname } # Clear all variables. System variables are readonly so we don't mind using * to get all Remove-Variable * -ErrorAction SilentlyContinue

Recursos usados

por 12.09.2015 / 17:26