Cambiar nombre de Exif.ps1

Cambiar nombre de Exif.ps1

Tengo una carpeta con fotografías tomadas con diferentes cámaras y todas estas fotografías tienen una correctaFechaHoraOriginalConjunto de etiquetas EXIF.

Supongamos una lista de archivos como esta:

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

Ahora me gustaría saber cómo cambiar el nombre de esos archivos de esta manera, según elFechaHoraOriginaletiqueta por supuesto:

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

Básicamente quieroexiftool(o un programa por lotes de Windows si eso no es posible directamente) paraclasificartoda la carpeta de archivos JPEG porFechaHoraOriginalascendente y la operación de cambio de nombre debería poner unencimeraprefijo delante del nombre del archivo (conservando así el nombre del archivo original).

Tambien me gustaria como hacer uncomando de prueba para obtener una vista previa del cambio de nombreantes de que ocurra (para ver si algo anda mal, supongo que usando elNombre de la pruebaetiqueta).

Respuesta1

Los elementos que desea usar con ExifTool son las -FileOrderopciones y la FileSequenceetiqueta, además de un poco de Perl usando la opción de formato avanzado. La opción FileOrder ordenará los archivos según el tiempo que indique la opción. Esto ralentiza un poco ExifTool, porque tiene que leer cada archivo dos veces, pero sigue siendo generalmente más rápido que otras opciones, como realizar bucles y llamar a ExifTool para cada bucle. La etiqueta FileSequence es interna de ExifTool y realiza un seguimiento del número del archivo que se está procesando actualmente. Comienza en 0, por lo que tendremos que agregarle 1 en el procesamiento avanzado. Allí también rellenaremos los ceros para que tengan al menos 3 caracteres.

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

Si funciona, simplemente reemplácelo -TestNamecon -FileName:
ExifTool "-FileName<${FileSequence;$_=0 x(3-length($_+1)).($_+1)}_$filename" -FileOrder DateTimeOriginal DIR

Para cambiar el número de ceros rellenos, cambie el 3 3-lengthpor el número que desee. Para cambiar el número inicial, cambie el 1 en $_+1.

Respuesta2

Revisé un par de herramientas de cambio de nombre. El principal problema es que herramientas comoCambiar nombre maestroyExifHerramientapuede acceder a datos EXIF. Pero no pude encontrar una manera de generar una lista numerada.

Entonces escribí un script de PowerShell para hacerlo. Comenté cada línea. Debería ser fácil de entender. Sólo léelos.

Lo primero que tuve que hacer fue buscar enID de "FechaHoraOriginal"para que podamos usar GetPropertyItem(MyExifID). En segundo lugar, agregamos todas las imágenes de una carpeta determinada que realmente tienen un DateTimeOriginal a una matriz. A partir de aquí fue fácil. Ordenamos la matriz por columna de fecha, incrementamos un contador simple y creamos nuestro nuevo nombre de archivo con el patrón 000_oldname.

Este script no modificará nada.Sólo genera algo como:

ingrese la descripción de la imagen aquí

Úselo para comprobar qué haría el script. Después de haber verificado los posibles resultados, elimine el indicador de comentario #antes de la línea #Rename-Item $_[0].Fullname $newName.De ahora en adelante, el script cambiará el nombre de sus archivos en consecuencia.

Cambiar nombre de Exif.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

información relacionada