Ich möchte die Dateien in einem Verzeichnis in fortlaufende Nummern umbenennen. Basierend auf dem Erstellungsdatum der Dateien.
Für das Beispiel sadf.jpg
auf 0001.jpg
, wrjr3.jpg
um 0002.jpg
und so weiter, die Anzahl der führenden Nullen auf der Gesamtmenge der Dateien abhängig (keine Notwendigkeit für zusätzliche Nullen , wenn nicht erforderlich).
bash
rename
batch-rename
Gnutt
quelle
quelle
Antworten:
Versuchen Sie, eine Schleife zu verwenden
let
, undprintf
für die Polsterung:Die Verwendung des
-i
Flags verhindert das automatische Überschreiben vorhandener Dateien.quelle
printf -v new "%04d.jpg" ${a}
den Wert auch in die Variable einfügen. Und((a++))
erhöht die Variable. Dies geschieht auch nicht in der Reihenfolge des Erstellungsdatums oder minimiert die Auffüllung, die im OP angegeben sind. Es ist jedoch zu beachten, dass Linux / Unix kein Erstellungsdatum speichert.mv -- "$i" "$new"
Quelldateinamen, die mit Bindestrichen beginnen, korrekt zu behandeln. wie es ist,mv
wird versuchen , solche Dateinamen als Sammlungen von Flaggen zu analysieren.-i
sollte in die Antwort aufgenommen werden und die Notiz sollte entsprechend umgeschrieben werden. das wird sicherer sein. :(Schönheit in einer Zeile:
Sie können ändern ,
.ext
mit.png
,.jpg
etc.quelle
ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; done
um null aufgefüllte Zahlen zu haben-n
dem Befehl mv hinzufügen , um ein versehentliches Überschreiben von Dateien zu verhindern. Entdeckt dies auf die harte Tour!ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done
Ergebnisse: (1) sortiert nach Änderungsreihenfolge, spätere Dateien mit späteren Indizes; (2) ignoriert Verzeichnisse - und nicht rekursiv; (3) Pads-Indizes; (4) behält die ursprüngliche Erweiterung bei.Ich mag die Lösung von gauteh wegen ihrer Einfachheit, aber sie hat einen wichtigen Nachteil. Wenn Sie mit Tausenden von Dateien arbeiten, erhalten Sie möglicherweise die Meldung "Argumentliste zu lang" ( mehr dazu ), und zweitens kann das Skript sehr langsam werden. In meinem Fall wurde das Skript bei ca. 36.000 Dateien um ca. 36.000 Dateien verschoben. ein Artikel pro Sekunde! Ich bin mir nicht sicher, warum das passiert, aber die Regel, die ich von Kollegen bekam, war "
find
ist dein Freund" .Um Gegenstände zu zählen und Befehle zu erstellen, wurde gawk verwendet. Beachten Sie jedoch den Hauptunterschied. Standardmäßig wird
find
nach Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen gesucht. Beschränken Sie daher die Suche bei Bedarf nur auf das aktuelle Verzeichnis (verwenden Sie, umman find
zu sehen, wie).quelle
NR
für einen kürzeren Befehl zu verwenden.gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
$(rm -rf /).jpg
.for
Schleife dauert streng genommen nicht 1 Sekunde pro Datei. Es dauert lange, die 36.000 Dateinamen aus dem Dateisystem abzurufen und sie dann relativ schnell zu durchlaufen. Viele Dateisysteme haben Probleme mit großen Verzeichnissen, unabhängig davon, welche genauen Befehle Sie ausführen. In der Regelfind
ist dies jedoch schneller als ein Shell-Platzhalter, da die Liste der übereinstimmenden Dateien abgerufen und sortiert werden muss.mit dem Befehl "umbenennen"
oder
quelle
rename
(Linux Mint 13) hat keine-N
Option.rename
Befehl, aber ich wusste nie davon-N
! Vielen Dank!rename
. Der von @Bostrot gepostete Link ist ein weiteres Tool zum Umbenennen, und es scheint, als hätte @RomanRhrnNesterov dieses verwendet. ¶ An alle Benutzerrename
von Peder Stray und Larry Wall (Paketperl-rename
unter Arch Linux und Paketrename
unter Debian / Ubuntu): Sie können sich$N
selbst definieren :perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
Die Verwendung der Pero-Lösung unter OSX erforderte einige Änderungen. Ich benutzte:
Hinweis: Die Backslashes dienen zur Fortsetzung der Leitung
Bearbeiten 20. Juli 2015: Das Feedback von @ klaustopher wurde aufgenommen, um das
\"%s\"
Argument desmv
Befehls zu zitieren und Dateinamen mit Leerzeichen zu unterstützen.quelle
$(rm -rf /).jpg
.mv
. Wenn Sie eine Datei mit dem Namen haben,some thing.jpg
schlägt Ihr Skript fehl. Dies ist, was ich verwendet habe:find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
-maxdepth 1
, um nur an JPGs im aktuellen Verzeichnis zu arbeiten, da es besser ist, auf Nummer sicher zu gehen.ls -1 *.jpg
anstatt zu finden, sonst wird es nicht sortiert. Oder fügen Sie eine|sort|
vor awkEin sehr einfacher Bash-One-Liner, der die ursprünglichen Erweiterungen beibehält, führende Nullen hinzufügt und auch unter OSX funktioniert:
Vereinfachte Version von http://ubuntuforums.org/showthread.php?t=1355021
quelle
9.ext
vorher nicht sortiert11.ext
, aber andere Tools (wiels
) tun dies auch nicht.Um in allen Situationen zu arbeiten, geben Sie ein "" für Dateien ein, deren Name Leerzeichen enthält
quelle
$(rm -rf /)
weiterhin berücksichtigt.Wenn Sie
rename
dies nicht unterstützen-N
, können Sie Folgendes tun:Bearbeiten Um mit einer bestimmten Nummer zu beginnen, können Sie den folgenden (etwas hässlich aussehenden) Code verwenden. Ersetzen Sie einfach 123 durch die gewünschte Nummer:
Hier werden die Dateien in der Reihenfolge ihrer Erstellungszeit aufgelistet (neueste zuerst, hinzufügen
-r
zum umgekehrten Sortieren zu ls ) und dann diese Liste der Dateien zum Umbenennen gesendet. Beim Umbenennen wird Perl-Code im regulären Ausdruck verwendet, um den Zähler zu formatieren und zu erhöhen.Wenn Sie jedoch mit JPEG-Bildern mit EXIF-Informationen arbeiten, würde ich empfehlen
exiftool
Dies stammt aus der exiftool-Dokumentation unter "Umbenennen von Beispielen".
quelle
rename
?Installieren Sie unter OSX das Umbenennungsskript von Homebrew:
Dann können Sie es wirklich lächerlich leicht machen:
Oder um ein schönes Präfix hinzuzufügen:
quelle
Global symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
Befolgen Sie den Befehl, um alle Dateien in Sequenz und auch Kleinbuchstabenerweiterung umzubenennen:
quelle
Ich hatte ein ähnliches Problem und schrieb aus diesem Grund ein Shell-Skript. Ich habe beschlossen, es zu veröffentlichen, obwohl bereits viele gute Antworten veröffentlicht wurden, da ich denke, dass es für jemanden hilfreich sein kann. Fühlen Sie sich frei, es zu verbessern!
nummerieren
@Gnutt Das gewünschte Verhalten kann durch Eingabe der folgenden Werte erreicht werden:
Wenn die Option
-r
weggelassen wird, wird das Reiben nur simuliert (sollte zum Testen hilfreich sein).Die Option L beschreibt die Länge der Zielnummer (die mit führenden Nullen gefüllt wird). Es ist auch möglich, ein Präfix / Suffix mit den Optionen hinzuzufügen
-p <prefix>
-s <suffix>
.Wenn jemand möchte, dass die Dateien numerisch sortiert werden, bevor sie nummeriert werden, entfernen Sie einfach die
-o modtime
Option.quelle
quelle
Nehmen wir an, wir haben diese Dateien in einem Verzeichnis, das in der Reihenfolge der Erstellung aufgelistet ist, wobei die erste die älteste ist:
ls -1cr
gibt dann genau die Liste oben aus. Sie können dann verwendenrename
:welche Ausgänge
Die Warnung "Verwendung eines nicht initialisierten Werts […]" wird für Dateien ohne Erweiterung angezeigt. Sie können es ignorieren.
Entfernen Sie
-n
aus demrename
Befehl, um die Umbenennung tatsächlich anzuwenden.Diese Antwort ist inspiriert von Lukes Antwort vom April 2014 . Gnutt's Anforderung, die Anzahl der führenden Nullen abhängig von der Gesamtmenge der Dateien festzulegen, wird ignoriert.
quelle
ls -1tU
für die Erstellungszeit ändern konnte. Es musste auchrename
installiert werden, was ich nicht hatte.Wiederum mit Peros Lösung mit wenig Modifikation, da
find
der Verzeichnisbaum in der Reihenfolge durchlaufen wird, werden die Artikel in den Verzeichniseinträgen gespeichert. Dies ist (meistens) von Lauf zu Lauf auf demselben Computer konsistent und entspricht im Wesentlichen der Reihenfolge der Datei- / Verzeichniserstellung, wenn keine Löschvorgänge durchgeführt wurden.In einigen Fällen müssen Sie jedoch eine logische Reihenfolge festlegen, z. B. nach Namen, die in diesem Beispiel verwendet wird.
quelle
blahblah; rm -r * blahblah.jpg
?Nach Zeit sortiert, beschränkt auf JPG, führende Nullen und einen Basisnamen (falls Sie wahrscheinlich eine wollen):
(alles in einer Zeile, ohne die
\
)quelle
ls
in einem Skript verwendet wird.-vn umbenennen - entferne n für den Off-Test-Modus
{$ i = 1;} - Startnummer steuern
"% 04d.jpg" - Kontrollzähler Null 04 und Ausgangserweiterung .jpg einstellen
quelle
rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
Für mich hat diese Kombination von Antworten perfekt funktioniert:
ls -v
hilft bei der Bestellung von 1 10 9 in der richtigen Reihenfolge: 1 9 10 Reihenfolge, um Probleme mit der Dateinamenerweiterung mit JPG JPG JPEG zu vermeidengawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'
nummeriert mit 4 Zeichen und führenden Nullen neu. Indem ich mv vermeide, versuche ich nicht versehentlich, etwas zu überschreiben, das bereits vorhanden ist, indem ich versehentlich dieselbe Nummer habe.bash
wird ausgeführtBeachten Sie, was @xhienne gesagt hat. Das Weiterleiten unbekannter Inhalte an bash ist ein Sicherheitsrisiko. Dies war jedoch bei mir nicht der Fall, da ich meine gescannten Fotos verwendete.
quelle
Sie können auch ls verwenden
quelle
blahblah; rm -r * blahblah.JPG
?Die meisten anderen Lösungen überschreiben vorhandene Dateien, die bereits als Nummer benannt sind. Dies ist insbesondere dann ein Problem, wenn Sie das Skript ausführen, weitere Dateien hinzufügen und das Skript dann erneut ausführen.
Dieses Skript benennt vorhandene numerische Dateien zuerst um:
quelle
Dieser Oneliner listet alle Dateien im aktuellen Verzeichnis auf, sortiert nach Erstellungszeitstempel in umgekehrter Reihenfolge (dh die älteste Datei befindet sich am Anfang) und benennt sich automatisch mit nachgestellten Nullen um, je nach Anzahl der Dateien. Die Dateierweiterung bleibt erhalten.
Normalerweise habe ich seit Jahren nur einen Ordner für Bilder und Filme von Mobiltelefonen. Wenn Sie diesen Befehl anwenden, sind meine Bilder und Filme dann für eine Diashow in der richtigen Reihenfolge im Fernsehen oder auch in der Archivierung bereit.
Beachten Sie, dass Sie bei Kollisionen mit Dateinamen Dateien verlieren. Benennen Sie also zuerst in etwas Seltsames um
temp001.jpg
und führen Sie es dann zu Ihrem endgültigen Dateinamen aus.quelle
ls
Nicht nur einmal, sondern zweimal zu laufen sieht so aus, als sollte dies vermieden werden, aber ich habe es nicht eingehend untersucht.ls
Frage durchgeführt, weshalb zwei von ihnen erforderlich sind. 3. Solche Befehle sind One-Shots und nicht dazu gedacht, in Skripten enthalten zu sein. Es gibt also einen Grund, warum Leute Einzeiler bevorzugenHier ist, was für mich funktioniert hat.
Ich habe den Befehl zum Umbenennen verwendet , damit der Befehl mv nicht zwischen Leerzeichen und der tatsächlichen Datei verwechselt wird , wenn eine Datei Leerzeichen im Namen enthält .
quelle
Heutzutage gibt es eine Option, nachdem Sie mehrere Dateien zum Umbenennen ausgewählt haben (ich habe im thunar-Dateimanager gesehen).
Eine Eingabeaufforderung wird mit allen Dateien in diesem bestimmten Verzeichnis angezeigt. Überprüfen Sie dies einfach im Kategoriebereich
quelle
Dieses Skript sortiert die Dateien nach Erstellungsdatum unter Mac OS Bash. Ich benutze es, um Videos massenweise umzubenennen. Ändern Sie einfach die Erweiterung und den ersten Teil des Namens.
quelle
blahblah; rm -r * blahblah.mp4
?Hier eine andere Lösung mit dem Befehl "Umbenennen":
quelle
rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
Peros Antwort hat mich hierher gebracht :)
Ich wollte Dateien relativ zur Zeit umbenennen, da die Bildbetrachter die Bilder nicht in zeitlicher Reihenfolge anzeigten.
quelle
blahblah; rm -r * blahblah.jpg
? Nur ein extremes Beispiel.Wenn Sie Image Annotator zum Beschriften der Bilder verwenden.
$ make qt5py3
$ python3 labelImg.py
quelle
Um 6000 Dateien in einem Ordner neu zu nummerieren, können Sie die Option 'Umbenennen' des ACDsee-Programms verwenden.
Verwenden Sie zum Definieren eines Präfixes dieses Format:
####"*"
Stellen Sie dann die Startnummer ein und drücken Sie Umbenennen. Das Programm benennt alle 6000 Dateien mit fortlaufenden Nummern um.
quelle