Gleichzeitiges Umbenennen von Hunderten von Dateien für eine ordnungsgemäße Sortierung

23

Ich habe eine Tonne von Dateien, die alle genannten Sachen wie 1.jpg, 2.jpg, 3.jpgund so weiter bis zu 1439.jpg, aber ich habe ein Problem mit einem meinen Projekten und Alphabetisierung. Es geht in der Regel in der Reihenfolge 1.jpg, 10.jpg, 11.jpgund so weiter.

Was ich brauche, ist eine Möglichkeit, die Dateien so zu benennen, dass sie in dem Format vorliegen, wie es 00001.jpgder Fall ist 01439.jpg.

Wie könnte ich das schnell und effizient machen?

Kaz Wolfe
quelle
Was Sie suchen, ist "natürliches Sortieren", vielleicht hilft das: askubuntu.com/questions/41390/…
Fabian Blechschmidt
Antwort, die keine direkte Antwort ist? ls -v unix.stackexchange.com/questions/33909/…
WernerCD
+1, weil ich erfolglos versucht habe, dies in zu tun pyrenamer.
Parto
@FabianBlechschmidt, ich brauche das in einem Programm, das nicht für Nautilus oder ähnliches ist. Es ist für ein individuelles Projekt.
Kaz Wolfe
Ich denke, Sie haben darüber nachgedacht, eine natürliche Sortierung zu implementieren? Aber ich verstehe, das Umbenennen von Dateien ist ganz einfach und wenn es die Arbeit macht, großartig :)
Fabian Blechschmidt

Antworten:

35

Ubuntu wird mit einem Skript namens geliefert rename. Es ist nur ein kleines Perl-Skript, das eine Reihe leistungsstarker Funktionen zum Umbenennen von Massen enthält. Das Beste (in diesem Fall) ist jedoch die Möglichkeit, Perl während des Ersetzens auszuführen. Das Ergebnis ist eine wirklich kompakte Lösung:

rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

Dies ist ähnlich wie bei den anderen printfAntworten hier, aber alles wird für uns erledigt. Der obige Code bezieht sich auf eine 5-stellige Zahl (einschließlich einer variablen Anzahl führender Nullen).

Es sucht und ersetzt den ersten gefundenen Zahlenstring durch eine mit Nullen aufgefüllte Version und lässt den Rest des Dateinamens in Ruhe. Dies bedeutet, dass Sie sich nicht zu viele Gedanken darüber machen müssen, ob Sie eine Erweiterung oder ein Präfix bei sich haben.

Hinweis: Dies ist nicht vollständig portabel. Viele Distributionen verwenden rename.uldas util-linuxPaket als Standard- renameBinärdatei. Dies ist eine deutlich verkümmerte Alternative (siehe man rename.ul), die das Obige nicht versteht. Wenn Sie dies auf einer Plattform möchten, auf der Perls Umbenennung nicht verwendet wird, finden Sie zunächst heraus, wie Sie diese installieren.


Und hier ist ein Testgeschirr:

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

Und ein Beispiel Präfixe (wir machen nichts anderes):

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3
Oli
quelle
Wenn ich eine Perl-Person wäre, wäre dies die perfekte Lösung. Wirklich ordentlich.
MGP
2
Es wird kein Perl verwendet, sondern nur ein Tool, das bereits in Perl geschrieben wurde.
Rob
1
In diesem Fall handelt es sich um einen einzelnen Perl-Befehl, aber es ist nicht gerade schwer zu heben. sprintfin Perl verhält sich ähnlich wie sprintfin anderen Sprachen.
Oli
21
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

Bearbeiten

Erläuterung:

  • if [[ $f =~ [0-9]+\. ]] Stellt sicher, dass nur Dateien umbenannt werden, deren Namen Zahlen sind (gefolgt von einem Punkt).
  • printf "%.5d" NUMBER fügt die führenden Nullen hinzu
  • "${f%.*}" schneidet die Endung (.jpg) und lässt nur die Nummer
  • .jpgNach dem zweiten Backtick wird die Dateierweiterung erneut hinzugefügt.

Beachten Sie, dass dies nur bei Dateinamen funktioniert, bei denen es sich um Zahlen handelt. Das Linksauffüllen von führenden Nullen zu nicht nummerierten Dateien würde ein anderes Format erfordern.

Wenn Sie experimentieren möchten, versuchen Sie diesen Befehl:

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

Bearbeiten 2

Verbesserte die Sicherheit des Befehls, indem sichergestellt wurde, dass nur Dateinamen umbenannt werden, bei denen es sich um Nummern handelt. Beachten Sie, dass bereits vorhandene Dateien mit dem Namen 00001.jpg überschrieben werden.

sмurf
quelle
Dieses einzeilige Skript funktioniert 'out of box' auf Ubuntu und anderen Linux-Distributionen! 😃 Sie müssen keine zusätzlichen Tools mit Perl, Python usw. installieren.
HEXcube
6

Unten ein Python-Skript.

Das Skript fügt führende Nullen bis zur festgelegten Anzahl von Ziffern hinzu. Ist der Name größer, bleibt die Datei (Name) unberührt.

Das Kombinieren verschiedener Erweiterungen in einer Umbenennungsaktion kann einige Vorteile bringen. Zum Hinzufügen von Erweiterungen fügen Sie diese einfach zum Beispiel dem Tupel hinzu extensions = (".jpg", ".jpeg", ".tiff").

Kopieren Sie den Text in eine leere Datei, speichern Sie ihn unter rename.py, geben Sie den korrekten Pfad zum Dateiverzeichnis ( sourcedir), die Anzahl der Stellen, die die neuen Namen haben sollen ( number_ofdigits) und die Dateierweiterung (en), die umbenannt werden sollen ( extensions), ein.

Führen Sie es mit folgendem Befehl aus:

python3 /path/to/script/rename.py

Das Drehbuch:

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

bearbeiten:

Unten eine leicht verbesserte Version. Es ermittelt automatisch den längsten Namen im Verzeichnis und fügt führende Nullen bis zur Länge des längsten Namens hinzu.

Beispiel:

1.jpg
12.jpg
123.jpg

wird:

001.jpg
012.jpg
123.jpg

Die Anzahl der Stellen muss nicht eingestellt werden.

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])
Jacob Vlijm
quelle
2

In Perl ist ein Umbenennungsdienstprogramm implementiert, das dies sehr einfach macht:

rename 's/\d+/sprintf("%05d",$&)/e' *.jpg

Das erste Argument ist ein Perl-Ausdruck, der für jeden Dateinamen ausgewertet wird.

Mats Kindahl
quelle
0

Es gibt eine GUI, die dies erledigt. Sie heißt pyRenamer und befindet sich in den Repositories. Installieren, starten, Verzeichnis auswählen und auf der Registerkarte "Muster" das Muster "Umbenannter Dateiname" auf "{num5}" setzen und auf die Schaltfläche "Umbenennen" klicken. Sie können auch eine Vorschau der Vorgänge vor dem Umbenennen anzeigen.

user287888
quelle
Während Ihre Antwort funktioniert, beachten Sie bitte, dass dies ein shell-scriptingAbschnitt ist, was bedeutet, dass ich nach einer Kommandozeilenantwort suche. Können Sie außerdem weitere Informationen zum Programm bereitstellen? Welches Musterformat ist zum Beispiel {num5}?
Kaz Wolfe
-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

Das ist grob, da es das Umbenennen nicht intelligent macht, muss man sich einen Trick dafür überlegen. Aber es sollte dir helfen, Sachen zu sortieren.

Update: Nun, Sie haben eine vollständigere Antwort.

Swarnendu Biswas
quelle
2
es benennt 1439.jpg in 0001439.jpg um.
Avinash Raj
Ja, ich weiß, nur zusätzliche Nullen aufgefüllt, die mit der Sortierung noch funktionieren sollten.
Swarnendu Biswas