Möchten Sie eine einzige Lösung, die für alle diese Plattformen funktioniert? Oder eine Lösung, die bei jedem funktioniert? Auf welche Skriptsprachen sind Sie beschränkt oder bevorzugen Sie? Befinden sich alle Fotos in einem oder mehreren Ordnern?
EBGreen
@EBGreen - Ich habe eine Lösung, die überall dort funktioniert, wo Bash verfügbar ist. Ich möchte auch eine, die unter Windows funktioniert. (und Cygwin zu empfehlen ist Betrug)
Nifle
Warum nicht die MD5-Summe verwenden?
AngelLeliel
Während MD5-Summen die Wahrscheinlichkeit von Namenskollisionen verringern würden, sind MD5-Kollisionen ein bekanntes Problem. mscs.dal.ca/~selinger/md5collision
EBGreen
@Angel - Die Verwendung der MD5-Summe als Name hätte für die Eindeutigkeit ziemlich gut funktioniert. Die zusätzliche Zeit, um die Summe für mehr als 4000 Fotos zu berechnen, wäre ein langweiliges Warten gewesen.
Nifle
Antworten:
8
Angenommen, alle Bilder befinden sich in einem einzigen Ordner, würde dies in Powershell funktionieren:
Es ist möglich, dass Sie potenzielle Namenskollisionen erhalten, aber Get-Random gibt standardmäßig ein 32-Bit-Int ohne Vorzeichen von 0 bis Int32.MaxValue (0 bis 2147483647) zurück. Sie könnten sicherlich ein weiteres Get-Random hinzufügen, um die Wahrscheinlichkeit einer Kollision zu verringern, genau wie in der Bash-Antwort.
Sieht so aus, als würde eine zweite JPG-Datei an das Ergebnis angehängt.
useSticks
8
Eine Möglichkeit, wenn Sie eine Bash-Shell zur Hand haben, ist die Verwendung der $RANDOMUmgebungsvariablen. Es werden zufällige Werte zwischen 0 und 32767 generiert.
Eine einfache for-Schleife in Bash funktioniert einwandfrei, wenn Sie nur einige hundert Dateien haben.
for i in*.jpg;do mv -i "$i" ${RANDOM}.jpg;done
Da ich ungefähr 4000 Dateien umbenennen musste, bekam ich bald Kollisionen, die die -iFlagge mvabfing. Das Hinzufügen eines weiteren hat $RANDOMsich darum gekümmert.
for i in*.jpg;do mv -i "$i" ${RANDOM}${RANDOM}.jpg;done
Anstelle von "${RANDOM}${RANDOM}.jpg"dir könnte man auch sagen "${RANDOM}-$i". Dies vermeidet Kollisionen und behält die alten Namensinformationen bei (sowie erfüllt die Anforderungen an die zufällige Sortierung).
Bitmaske
Oooh ... ich mag es ... ich werde die PS-Lösung optimieren, um das zu integrieren.
EBGreen
@bitmask - Ein guter Punkt. In diesem Fall hatten die Bilder keine aussagekräftigen Namen und enthielten manchmal Leerzeichen, so dass ich froh war, sie loszuwerden.
Nifle
Wie kann dies verallgemeinert werden, um eine Erweiterung zu akzeptieren?
Yarun kann
4
for f in *; do ext=$(echo "$f" | sed 's|\([^.]*\)||'); mv "$f" "$(uuidgen)$ext"; done
Dies funktioniert nicht richtig, wenn der Dateiname "myfile.is.a.jpg" lautet. Der resultierende Randomm-Name lautet "8c5b4ee8-abd8-4f62-b641-48e58baf9186.is.a.jpg:
yarun can
-1
Die meisten Batch-Datei-Renamer können dies, hier ist einer
Einfache Methode wäre eine fortlaufende Nummerierung der Datei, ich bin sicher, es gibt andere Optionen mit dieser Software, verwenden Sie Ihre Fantasie.
Antworten:
Angenommen, alle Bilder befinden sich in einem einzigen Ordner, würde dies in Powershell funktionieren:
Es ist möglich, dass Sie potenzielle Namenskollisionen erhalten, aber Get-Random gibt standardmäßig ein 32-Bit-Int ohne Vorzeichen von 0 bis Int32.MaxValue (0 bis 2147483647) zurück. Sie könnten sicherlich ein weiteres Get-Random hinzufügen, um die Wahrscheinlichkeit einer Kollision zu verringern, genau wie in der Bash-Antwort.
quelle
Eine Möglichkeit, wenn Sie eine Bash-Shell zur Hand haben, ist die Verwendung der
$RANDOM
Umgebungsvariablen. Es werden zufällige Werte zwischen 0 und 32767 generiert.Eine einfache for-Schleife in Bash funktioniert einwandfrei, wenn Sie nur einige hundert Dateien haben.
Da ich ungefähr 4000 Dateien umbenennen musste, bekam ich bald Kollisionen, die die
-i
Flaggemv
abfing. Das Hinzufügen eines weiteren hat$RANDOM
sich darum gekümmert.quelle
"${RANDOM}${RANDOM}.jpg"
dir könnte man auch sagen"${RANDOM}-$i"
. Dies vermeidet Kollisionen und behält die alten Namensinformationen bei (sowie erfüllt die Anforderungen an die zufällige Sortierung).for f in *; do ext=$(echo "$f" | sed 's|\([^.]*\)||'); mv "$f" "$(uuidgen)$ext"; done
quelle
Die meisten Batch-Datei-Renamer können dies, hier ist einer
Einfache Methode wäre eine fortlaufende Nummerierung der Datei, ich bin sicher, es gibt andere Optionen mit dieser Software, verwenden Sie Ihre Fantasie.
Hier ist die, die ich für Massenumbenennungsaufgaben verwende
quelle