Umbenennen von JPEGs durch Hinzufügen eines Präfixes nach Aufnahmedatum

2467
virtualdj

Ich habe einen Ordner mit Bildern, die mit verschiedenen Kameras aufgenommen wurden, und für alle diese Bilder ist ein korrektes DateTimeOriginal EXIF-Tag festgelegt.

Angenommen, eine Liste von Dateien wie folgt:

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

Nun möchte ich wissen, wie Sie diese Dateien auf diese Weise umbenennen können, basierend auf dem DateTimeOriginal- Tag.

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

Im Grunde mag ich exiftool (oder ein Windows - Batch - Programm, wenn das nicht möglich, direkt) sortieren, den gesamten Ordner von JPEGs nach Aufnahmedatum aufsteigend und der Umbenennung sollte einen setzenen Zähler Präfix vor dem Dateinamen (also die ursprünglichen Dateinamen beibehalten).

Ich möchte auch, wie ein Testbefehl ausgeführt wird, um eine Vorschau der Umbenennung anzuzeigen, bevor er auftritt (um zu sehen, ob etwas nicht stimmt, nehme ich an, dass ich den TestName- Tag benutze ).

1

2 Antworten auf die Frage

1
nixda

Ich habe ein paar Umbenennungs-Tools überprüft. Das Hauptproblem ist, dass Tools wie Rename Master und ExifTool auf EXIF-Daten zugreifen können. Ich konnte jedoch keine Möglichkeit finden, eine nummerierte Liste zu erstellen.

Also habe ich dazu ein PowerShell-Skript geschrieben. Ich kommentierte jede Zeile. Es sollte leicht verständlich sein. Lesen Sie sie einfach.

Als erstes musste ich die ID von "DateTimeOriginal" suchen, damit wir sie verwenden können GetPropertyItem(MyExifID). Zweitens fügen wir alle Bilder aus einem bestimmten Ordner, die ein DateTimeOriginal haben, zu einem Array hinzu. Von hier aus war es einfach. Wir sortieren das Array nach Datumsspalte, erhöhen einen einfachen Zähler und erstellen mit dem Muster unseren neuen Dateinamen 000_oldname.

Dieses Skript ändert nichts. Es gibt nur etwas wie:

enter image description here

Verwenden Sie es, um zu überprüfen, was das Skript tun würde. Nachdem Sie die möglichen Ergebnisse geprüft haben, entfernen Sie das Kommentarkennzeichen #vor der Zeile #Rename-Item $_[0].Fullname $newName. Ab jetzt benennt das Skript Ihre Dateien entsprechend um.

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 @ } | 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]_") { #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 

Verwendete Ressourcen

Interessantes Skript, danke! Es funktioniert perfekt. Die @ StarGeek-Lösung scheint jedoch einfacher zu sein, da sie nur auf ** ExifTool ** basiert. Ihr kommentiertes Beispiel ist jedoch gut, um Powershell zu lernen. virtualdj vor 9 Jahren 0
1
StarGeek

Die Elemente, die Sie mit ExifTool verwenden möchten, sind die -FileOrderOptionen und das FileSequenceTag sowie ein wenig Perl mit der Option Erweiterte Formatierung. Die Option FileOrder sortiert die Dateien nach der Zeit, die Sie mit der Option auflisten. Dies verlangsamt ExifTool etwas, da es jede Datei zweimal lesen muss, aber normalerweise immer noch schneller als andere Optionen ist, z. B. Schleifen und Aufrufen von ExifTool für jede Schleife. Das FileSequence-Tag ist intern in ExifTool und verfolgt die Nummer der aktuell verarbeiteten Datei. Es beginnt bei 0, daher müssen wir in der erweiterten Verarbeitung 1 hinzufügen. Dort werden wir auch die Nullen auffüllen, so dass es mindestens 3 Zeichen sind.

Versuchen Sie diesen Befehl:
ExifTool "-TestName<$_$filename" -FileOrder DateTimeOriginal DIR

Wenn es funktioniert, ersetzen Sie einfach -TestNamemit -FileName:
ExifTool "-FileName<$_$filename" -FileOrder DateTimeOriginal DIR

Um die Anzahl der aufgefüllten Nullen zu ändern, ändern Sie die 3 in 3-lengthdie gewünschte Anzahl. Um die Startnummer zu ändern, ändern Sie die 1 in $_+1.

Es ist fast perfekt, danke! Es gibt jedoch zwei Quircks mit ** 10 ** und ** 100 **, die eine führende 0 zu viel haben: `'20150831_124835.jpg' -> '009_20150831_124835.jpg', '20150831_131539.jpg' -> '0010_20150831_131539 .jpg ',' IMG_5291.JPG '->' 099_IMG_5291.JPG ',' IMG_5292.JPG '->' 0100_IMG_5292.JPG ',' 20150901_170708.jpg '->' 101_201509017070.jpg '. virtualdj vor 9 Jahren 0
Es ist auch erwähnenswert, dass das ** TestName ** -Tag seit der ** Version 9.64 von ExifTool eingeführt wurde (ich habe eine ältere Version verwendet und es fehlgeschlagen mit einer Menge von `Warnung: keine beschreibbaren Tags von **** gesetzt`) Mitteilungen). Dies kann für andere Benutzer nützlich sein, die diese Antwort lesen. virtualdj vor 9 Jahren 0
Ah ja. Das liegt daran, dass ich die Länge der Nummer gemessen habe und dann der Nummer 1 hinzugefügt habe. Mein dummer Fehler, die erweiterte Formatierung so kurz wie möglich zu halten. Der Befehl wurde korrigiert. Wenn Sie mit einer anderen Nummer beginnen müssen, müssen Sie beide Vorkommen von `($ _ + 1)` korrigieren. StarGeek vor 9 Jahren 0