Wie kann ich alle Bilddateien innerhalb eines Verzeichnisses (und rekursiv innerhalb seiner Unterverzeichnisse) umbenennen?

0

Ich habe ein Verzeichnis mit einer großen Anzahl von Bilddateien, von denen sich einige in Unterverzeichnissen befinden. Ich muss alle passenden Bilddateien *.png, *.jpg, *.jpeg, *.bmp, *.gifnach einem einfachen Muster umbenennen:

  • das gleiche Präfix für alle Dateien;
  • Eine Zahl mit auffüllenden Nullen, die als Hex-Zeichenfolge gedruckt wird.

Mein Ziel ist es, allen Bilddateien unabhängig von ihrer Erweiterung einen eindeutigen Namen zuzuweisen, damit ich sie dann in dasselbe Bildformat konvertieren kann, ohne dass die Gefahr besteht, dass diese Dateien mit demselben Namen überschrieben werden.

Ich habe ein Skript geschrieben, um das obige Verfahren durchzuführen (für die Verzeichnisliste habe ich mich vom Code-Snippet dieser Antwort inspirieren lassen ).

for root, dirs, filenames in os.walk(path):
    for filename in filenames:
        if filename.endswith((".jpeg", ".jpg", ".png", ".gif", ".bmp")):
            # rename file

Ich habe mich gefragt, ob es einen Bash- oder Powershell-Befehl gibt, um das obige Verfahren auszuführen.

enzom83
quelle

Antworten:

1

Ich spreche am besten Bash, aber ich bin mir sicher, dass Sie in Power Shell das Gleiche tun können. Ich gehe davon aus, dass Sie in das JPG-Format konvertieren und alle Dateien in einem ./output/-Verzeichnis speichern. Mein Skript würde so aussehen:

j=0;
for i in `find . -type f \( -iname *.jpg -o -iname *.jpeg -o -iname *.png -o -iname *.gif -o -iname *.bmp \)`
do
    j=$(($j+1))
    convert $i output/`printf "%06X" $j`.jpg
done

Dieses Skript startet einen Zähler '$ j' von 0. Dann findet es alle Dateien, die vom Typ Datei sind (anstelle von Verzeichnissen oder Symlinks oder ähnlichen Dingen) und Ihren angegebenen Erweiterungen in einer Weise, bei der die Groß- und Kleinschreibung keine Rolle spielt. Das () gruppiert eine Reihe von Elementen, die jeweils mit einem -o-OR-Bezeichner für den Befehl find verbunden sind.

Wir verwenden eine for-Schleife, um alle gefundenen Dateien durchzugehen und sie mit $ i zu kennzeichnen.

Innerhalb der Schleife erhöhe ich den Zähler $ j.

Dann konvertiere ich den gefundenen Dateinamen in .jpg und gebe ihn in das Verzeichnis ./output/ aus.

Der hexadezimale Dateiname ist 0 und wird mit einem printf-Befehl auf sechs Stellen aufgefüllt.

Adam Bumpus
quelle