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).

War es hilfreich?

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!

rechnen

@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 vermeiden
  • gawk '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).

  1. Wählen Sie mehrere Dateien aus
  2. Überprüfen Sie die Optionen
  3. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top