Umbenennen von Dateien in einem Ordner in fortlaufende Nummern
-
13-09-2020 - |
Frage
Ich möchte die Dateien in einem Verzeichnis in fortlaufende Nummern umbenennen.Basierend auf dem Erstellungsdatum der Dateien.
Zum Beispiel sadf.jpg
Zu 0001.jpg
, wrjr3.jpg
Zu 0002.jpg
und so weiter, die Anzahl der führenden Nullen hängt von der Gesamtzahl der Dateien ab (keine zusätzlichen Nullen erforderlich, wenn sie nicht benötigt werden).
Lösung
Versuchen Sie, eine Schleife zu verwenden, let
, Und printf
für die Polsterung:
a=1
for i in *.jpg; do
new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
mv -i -- "$i" "$new"
let a=a+1
done
Verwendung der -i
Flag verhindert das automatische Überschreiben vorhandener Dateien.
Andere Tipps
Schönheit in einer Zeile:
ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done
Du kannst ändern .ext
mit .png
, .jpg
, usw.
Ich mag Gautehs Lösung wegen ihrer Einfachheit, sie hat aber einen wichtigen Nachteil.Wenn Sie Tausende von Dateien ausführen, erhalten Sie möglicherweise die Meldung „Argumentliste zu lang“ (mehr dazu), und zweitens kann das Skript sehr langsam werden.In meinem Fall verschob sich das Skript bei der Ausführung von etwa 36.000 Dateien um ca.ein Artikel pro Sekunde!Ich bin mir nicht ganz sicher, warum das passiert, aber die Regel, die ich von Kollegen bekommen habe, lautete "find
ist dein Freund".
find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
Um Gegenstände zu zählen und Befehle zu erstellen, gaffen wurde benutzt.Beachten Sie jedoch den Hauptunterschied.Standardmäßig find
sucht nach Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen. Achten Sie daher darauf, die Suche bei Bedarf nur auf das aktuelle Verzeichnis zu beschränken (verwenden Sie man find
zu sehen, wie).
Die Verwendung der Pero-Lösung unter OSX erforderte einige Änderungen.Ich benutzte:
find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash
Notiz:Die Backslashes dienen der Zeilenfortsetzung
Bearbeiten 20. Juli 2015:Ich habe das Feedback von @klaustopher einbezogen, um das zu zitieren \"%s\"
Argument des mv
Befehl, um Dateinamen mit Leerzeichen zu unterstützen.
mit dem Befehl „Umbenennen“.
rename -N 0001 -X 's/.*/$N/' *.jpg
oder
rename -N 0001 's/.*/$N.jpg/' *.jpg
Ein sehr einfacher Bash-Einzeiler, der die ursprünglichen Erweiterungen beibehält, führende Nullen hinzufügt und auch unter OSX funktioniert:
num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done
Vereinfachte Version von http://ubuntuforums.org/showthread.php?t=1355021
Um in allen Situationen zu funktionieren, fügen Sie ein \" für Dateien ein, deren Name Leerzeichen enthält
find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
Wenn dein rename
unterstützt nicht -N
, Sie können so etwas tun:
ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'
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:
ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'
Hier werden die Dateien in der Reihenfolge ihrer Erstellungszeit aufgelistet (neueste zuerst, hinzufüg -r
an ls, um die Sortierung umzukehren), und sendet dann diese Liste der Dateien zum Umbenennen.Rename verwendet Perl-Code im regulären Ausdruck, um den Zähler zu formatieren und zu erhöhen.
Wenn Sie jedoch mit JPEG-Bildern mit EXIF-Informationen arbeiten, würde ich Ihnen empfehlen exiftool
Das ist von der Exiftool-Dokumentation, unter „Umbenennungsbeispiele“
exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir
Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
preserving the original file extension (%e). Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.
Unter OSX, installieren Sie das Umbenennungsskript von Homebrew:
brew install rename
Dann können Sie es ganz einfach machen:
rename -e 's/.*/$N.jpg/' *.jpg
Oder um ein schönes Präfix hinzuzufügen:
rename -e 's/.*/photo-$N.jpg/' *.jpg
Befolgen Sie den Befehl, um alle Dateien in Reihenfolge und auch in Kleinbuchstaben umzubenennen:
rename --counter-format 000001 --lower-case --keep-extension --expr='$_ = "$N" if @EXT' *
Ich hatte ein ähnliches Problem und habe aus diesem Grund ein Shell-Skript geschrieben.Ich habe beschlossen, es zu veröffentlichen, obwohl bereits viele gute Antworten gepostet wurden, weil ich denke, dass es für jemanden hilfreich sein kann.Fühlen Sie sich frei, es zu verbessern!
@Gnutt Das gewünschte Verhalten kann erreicht werden, indem man Folgendes eingibt:
./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r
Wenn die Option -r
wird das Reiben weggelassen, wird es nur simuliert (sollte zum Testen hilfreich sein).
Die ITion L beschreibt die Länge der Zielnummer (die mit führenden Nullen gefüllt wird) auch möglich, die Optionen ein Präfix/Suffix hinzuzufügen -p <prefix>
-s <suffix>
.
Falls jemand möchte, dass die Dateien numerisch sortiert werden, bevor sie nummeriert werden, entfernen Sie einfach das -o modtime
Möglichkeit.
a=1
for i in *.jpg; do
mv -- "$i" "$a.jpg"
a=`expr $a + 1`
done
Nehmen wir an, wir haben diese Dateien in einem Verzeichnis, aufgelistet in der Reihenfolge ihrer Erstellung, wobei die erste die älteste ist:
a.jpg
b.JPG
c.jpeg
d.tar.gz
e
Dann ls -1cr
gibt genau die obige Liste aus.Sie können es dann verwenden rename
:
ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'
welche ausgibt
rename(a.jpg, 000.jpg)
rename(b.JPG, 001.JPG)
rename(c.jpeg, 002.jpeg)
rename(d.tar.gz, 003.tar.gz)
Use of uninitialized value $1 in concatenation (.) or string at (eval 4) line 1.
rename(e, 004)
Bei Dateien ohne Erweiterung wird die Warnung „Verwendung eines nicht initialisierten Werts […]“ angezeigt;du kannst es ignorieren.
Entfernen -n
von dem rename
Befehl, um die Umbenennung tatsächlich anzuwenden.
Diese Antwort ist inspiriert von Lukes Antwort vom April 2014.Es ignoriert Gnutts Anforderung, die Anzahl der führenden Nullen abhängig von der Gesamtzahl der Dateien festzulegen.
Wiederum die Verwendung von Peros Lösung mit geringen Änderungen, weil find
Durchläuft den Verzeichnisbaum in der Reihenfolge, in der die Elemente in den Verzeichniseinträgen gespeichert werden.Dies ist (meistens) von Ausführung zu Ausführung auf demselben Computer konsistent und entspricht im Wesentlichen der „Erstellungsreihenfolge für Dateien/Verzeichnisse“, wenn keine Löschvorgänge vorgenommen wurden.
In manchen Fällen benötigen Sie jedoch eine logische Reihenfolge, beispielsweise nach Namen, die in diesem Beispiel verwendet wird.
find -name '*.jpg' | sort -n | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
Nach Zeit sortiert, beschränkt auf JPG, führende Nullen und einen Basisnamen (falls Sie wahrscheinlich einen möchten):
ls -t *.jpg | cat -n | \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done
(alles in einer Zeile, ohne \
)
Sie können auch verwenden ls
ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash
Die meisten anderen Lösungen überschreiben vorhandene Dateien, die bereits als Nummer benannt sind.Dies stellt insbesondere dann ein Problem dar, wenn das Skript ausgeführt wird, weitere Dateien hinzugefügt werden und das Skript anschließend erneut ausgeführt wird.
Dieses Skript benennt zunächst vorhandene numerische Dateien um:
#!/usr/bin/perl
use strict;
use warnings;
use File::Temp qw/tempfile/;
my $dir = $ARGV[0]
or die "Please specify directory as first argument";
opendir(my $dh, $dir) or die "can't opendir $dir: $!";
# First rename any files that are already numeric
while (my @files = grep { /^[0-9]+(\..*)?$/ } readdir($dh))
{
for my $old (@files) {
my $ext = $old =~ /(\.[^.]+)$/ ? $1 : '';
my ($fh, $new) = tempfile(DIR => $dir, SUFFIX => $ext);
close $fh;
rename "$dir/$old", $new;
}
}
rewinddir $dh;
my $i;
while (my $file = readdir($dh))
{
next if $file =~ /\A\.\.?\z/;
my $ext = $file =~ /(\.[^.]+)$/ ? $1 : '';
rename "$dir/$file", sprintf("%s/%04d%s", $dir, ++$i, $ext);
}
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'
-vn umbenennen - entfernen N für Aus-Testmodus
{$i=1;} - Startnummer kontrollieren
„%04d.jpg“ - Kontrollzähler Null 04 und Ausgabeerweiterung festlegen .jpg
Für mich hat diese Kombination von Antworten perfekt funktioniert:
ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash
ls -v
hilft bei der richtigen Bestellung von 1 10 9:1 9 10 Reihenfolge, um Dateinamenerweiterungsprobleme mit jpg JPG jpeg zu vermeidengawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'
Neunummerierung mit 4 Zeichen und führenden Nullen.Indem ich mv vermeide, versuche ich nicht versehentlich, etwas zu überschreiben, was bereits vorhanden ist, indem ich versehentlich dieselbe Nummer habe.bash
ausführt
Beachten Sie, was @xhienne gesagt hat: Das Weiterleiten unbekannter Inhalte an Bash stellt ein Sicherheitsrisiko dar.Bei mir war dies jedoch nicht der Fall, da ich meine gescannten Fotos verwendete.
Hier ist, was bei mir funktioniert hat.
Ich habe benutzt umbenennen Befehl, sodass, wenn eine Datei Leerzeichen im Namen enthält, mv Der Befehl darf nicht zwischen Leerzeichen und der tatsächlichen Datei verwechselt werden.
Here i replaced spaces , ' ' in a file name with '_' for all jpg files
#! /bin/bash rename 'y/ /_/' *jpg #replacing spaces with _ let x=0; for i in *.jpg;do let x=(x+1) mv $i $x.jpg done
Heutzutage gibt es eine Option, nachdem Sie mehrere Dateien zum Umbenennen ausgewählt haben (ich habe es im Thunar-Dateimanager gesehen).
- Wählen Sie mehrere Dateien aus
- Überprüfen Sie die Optionen
- Wählen Sie Umbenennen
Eine Eingabeaufforderung wird mit allen Dateien in diesem bestimmten DIR geliefert. Schauen Sie sich nur den Abschnitt Kategorie an
Dieses Skript sortiert die Dateien nach Erstellungsdatum auf der Mac OS-Bash.Ich verwende es, um Videos massenhaft umzubenennen.Ändern Sie einfach die Erweiterung und den ersten Teil des Namens.
ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash
Hier eine andere Lösung mit dem Befehl „Umbenennen“:
find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'
Dieser Oneliner listet alle Dateien im aktuellen Verzeichnis auf, sortiert sie nach Erstellungszeitstempel in umgekehrter Reihenfolge (d. h. die älteste Datei steht am Anfang) und benennt sie je nach Anzahl der Dateien automatisch mit nachgestellten Nullen um.Die Dateierweiterung bleibt erhalten.
Normalerweise habe ich seit Jahren nur einen Ordner für Handybilder und Filme.Mit diesem Befehl sind meine Bilder und Filme dann für eine Diashow in der richtigen Reihenfolge auf dem Fernseher oder zur Archivierung bereit.
Beachten Sie, dass bei Dateinamenkollisionen Dateien verloren gehen.Also benennen Sie es zunächst in etwas Seltsames um temp001.jpg
und dann mit Ihrem endgültigen Dateinamen ausführen.
DIGITS=$(ls | wc -l | xargs | wc -c | xargs); ls -tcr | cat -n | while read n f; do mv "$f" "$(printf "%0${DIGITS}d" $n).${f##*.}"; done
Peros Antwort hat mich hierher gebracht :)
Ich wollte Dateien relativ zur Zeit umbenennen, da die Bildbetrachter die Bilder nicht in zeitlicher Reihenfolge anzeigten.
ls -tr *.jpg | # list jpegs relative to time
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
Wenn Sie Image Annotator zum Beschriften der Bilder verwenden.
$ make qt5py3
$ python3 labelImg.py
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: ####"*"
Geben Sie dann die Startnummer ein und klicken Sie auf „Umbenennen“. Das Programm benennt dann alle 6000 Dateien mit fortlaufenden Nummern um.