Umbenennen von Dateien in einem Ordner in fortlaufende Nummern

230

Ich möchte die Dateien in einem Verzeichnis in fortlaufende Nummern umbenennen. Basierend auf dem Erstellungsdatum der Dateien.

Für das Beispiel sadf.jpgauf 0001.jpg, wrjr3.jpgum 0002.jpgund 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).

Gnutt
quelle
Ich habe mir stackoverflow.com/questions/880467/… angesehen , aber ich kann das nicht für mich zum Laufen bringen.
Gnutt
1
Linux / Unix speichert kein Erstellungsdatum.
Bis auf weiteres angehalten.
1
ls -1tr | Benennen Sie -vs /.*/ unser $ i um; if (! $ i) {$ i = 1;} sprintf ("% 04d.jpg", $ i ++) / e '
maXp

Antworten:

313

Versuchen Sie, eine Schleife zu verwenden let, und printffü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

Die Verwendung des -iFlags verhindert das automatische Überschreiben vorhandener Dateien.

gauteh
quelle
4
Sie können 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.
Bis auf weiteres angehalten.
3
Ich musste das MV doppelt in Anführungszeichen setzen, damit dies in meiner Bash-Umgebung funktioniert. mv "$ {i}" "$ {new}"
Gary Thomann
2
Könnte nur Cygwin sein (obwohl das Terminalverhalten weitgehend mit normalen Unix-Shells identisch ist), aber es scheint ein Problem zu geben, wenn der Dateiname Leerzeichen enthält.
Geesh_SO
2
Es wäre wahrscheinlich auch wünschenswert, mv -- "$i" "$new"Quelldateinamen, die mit Bindestrichen beginnen, korrekt zu behandeln. wie es ist, mvwird versuchen , solche Dateinamen als Sammlungen von Flaggen zu analysieren.
Charles Duffy
2
Ich habe ungefähr 800 Dateien auf einen Blick verloren. Ich denke, -isollte in die Antwort aufgenommen werden und die Notiz sollte entsprechend umgeschrieben werden. das wird sicherer sein. :(
KrIsHnA
268

Schönheit in einer Zeile:

ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done 

Sie können ändern , .extmit .png, .jpgetc.

Gemeinschaft
quelle
4
Legende :), ich habe dies auf Git Shell unter Windows verwendet, funktioniert super! ^^.
Mr.K
4
Funktioniert super. Schönheit in einer Linie. Ich habe ls -tr hinzugefügt, um die Dateien zum letzten geänderten Zeitpunkt abzurufen.
Ranjith Siji
32
füge printf wie folgt hinzu: ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; doneum null aufgefüllte Zahlen zu haben
Seweryn Niemiec
8
Warnung: Möglicherweise möchten Sie -ndem Befehl mv hinzufügen , um ein versehentliches Überschreiben von Dateien zu verhindern. Entdeckt dies auf die harte Tour!
Ian Danforth
4
Zusammenstellung einiger großartiger Ideen aus Kommentaren zu dieser und anderen Antworten: 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.
Jorge
63

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 " findist 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, wurde gawk verwendet. Beachten Sie jedoch den Hauptunterschied. Standardmäßig wird findnach Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen gesucht. Beschränken Sie daher die Suche bei Bedarf nur auf das aktuelle Verzeichnis (verwenden Sie, um man findzu sehen, wie).

Pero
quelle
7
Ich habe geändert, um die Zeilennummer NRfür einen kürzeren Befehl zu verwenden. gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
Apiwat Chantawibul
12
Massive Sicherheitslücken hier. Überlegen Sie, ob Sie eine Datei mit dem Namen haben $(rm -rf /).jpg.
Charles Duffy
Danke, dass du Charles darauf hingewiesen hast. Können Sie eine sichere Lösung vorschlagen?
Beibei2
2
bricht zusammen, falls der Dateiname Leerzeichen enthält. Verwenden Sie Anführungszeichen um den Quelldateinamen. printf "mv"% s "% 04d.jpg \ n", $ 0, a ++
baskin
1
Die forSchleife 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 Regel findist dies jedoch schneller als ein Shell-Platzhalter, da die Liste der übereinstimmenden Dateien abgerufen und sortiert werden muss.
Tripleee
30

mit dem Befehl "umbenennen"

rename -N 0001 -X 's/.*/$N/' *.jpg

oder

rename -N 0001 's/.*/$N.jpg/' *.jpg
Roman Rhrn Nesterov
quelle
32
Mein rename(Linux Mint 13) hat keine -NOption.
Luke H
Ich kann nur für die Erwähnung des Umbenennungsbefehls upvoten, ich habe noch nie davon gehört
user907860
8
Ich bin daran interessiert zu wissen, wo man einen Umbenennungsbefehl mit der Option -N erhält. Mein Ubuntu 14.04 hat es nicht.
Stephan Henningsen
1
Ich liebe den renameBefehl, aber ich wusste nie davon -N! Vielen Dank!
Dan Lecocq
1
Es gibt mindestens drei verschiedene Tools, die als bekannt sindrename . Der von @Bostrot gepostete Link ist ein weiteres Tool zum Umbenennen, und es scheint, als hätte @RomanRhrnNesterov dieses verwendet. ¶ An alle Benutzer renamevon Peder Stray und Larry Wall (Paket perl-renameunter Arch Linux und Paket renameunter Debian / Ubuntu): Sie können sich $Nselbst definieren :perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
Socowi
30

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

Hinweis: Die Backslashes dienen zur Fortsetzung der Leitung

Bearbeiten 20. Juli 2015: Das Feedback von @ klaustopher wurde aufgenommen, um das \"%s\"Argument des mvBefehls zu zitieren und Dateinamen mit Leerzeichen zu unterstützen.

bewei2
quelle
3
Wie bei Peros Lösung gibt es hier Sicherheitslücken. Überlegen Sie, ob Sie eine Datei mit dem Namen haben $(rm -rf /).jpg.
Charles Duffy
Danke, das funktioniert. Aber Sie sollten das erste Argument dazu zitieren mv. Wenn Sie eine Datei mit dem Namen haben, some thing.jpgschlä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
Klaustopher
Ich würde wahrscheinlich verwenden -maxdepth 1, um nur an JPGs im aktuellen Verzeichnis zu arbeiten, da es besser ist, auf Nummer sicher zu gehen.
Peter Perháč
Wenn Sie das Pipe-Zeichen an das Ende der vorherigen Zeile verschieben, benötigen Sie keine Backslashes.
Tripleee
Sie können verwenden, ls -1 *.jpganstatt zu finden, sonst wird es nicht sortiert. Oder fügen Sie eine |sort|vor awk
JPT
28

Ein sehr einfacher Bash-One-Liner, 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

Roy Shilkrot
quelle
Genau das, wonach ich gesucht habe. Mir gefällt, dass Sie den Startindex einstellen können.
Jack Vial
2
Bitte beachten Sie, dass dadurch die ursprüngliche Reihenfolge der Dateien nicht beibehalten wird.
Roy Shilkrot
@RoyShilkrot Was meinst du mit » wird die ursprüngliche Bestellung nicht behalten «? Globs in Bash- und anderen Posix-Shells werden in sortierter Reihenfolge entsprechend dem Gebietsschema des Systems erweitert. Natürlich wird dies 9.extvorher nicht sortiert 11.ext, aber andere Tools (wie ls) tun dies auch nicht.
Socowi
11

Um in allen Situationen zu arbeiten, geben 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
Abdala Cerqueira
quelle
3
Deckt nicht alle Situationen ab. Ein Dateiname mit wörtlichen Anführungszeichen kann trivial entkommen - und da Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen verwenden, werden Erweiterungen wie diese $(rm -rf /)weiterhin berücksichtigt.
Charles Duffy
11

Wenn Sie renamedies nicht unterstützen -N, können Sie Folgendes 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ü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".

   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.
Luke H.
quelle
Wie kann ich mit einer bestimmten Nummer beginnen rename?
Jan
6

Installieren Sie unter OSX das Umbenennungsskript von Homebrew:

brew install rename

Dann können Sie es wirklich lächerlich leicht machen:

rename -e 's/.*/$N.jpg/' *.jpg

Oder um ein schönes Präfix hinzuzufügen:

rename -e 's/.*/photo-$N.jpg/' *.jpg
Trisweb
quelle
3
Das ist ein großartiges Skript, und es hängt nur von Perl ab. Brew funktioniert nur auf Macs, aber Sie können es von github ( github.com/ap/rename ) herunterladen und unter Linux oder Windows verwenden.
Tim Danner
3
das funktioniert bei mir nicht Ich habeGlobal symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
Anthony Chung
Als Mac-Benutzer freue ich mich, Ihnen mitteilen zu können, dass die von @TimDanner verknüpfte Umbenennungsanwendung sehr portabel ist. Es war so einfach wie das Herunterladen des Zip-Archivs und das Ablegen des Umbenennungsdienstprogramms in einem Verzeichnis, das in meinem Bash-Profilpfad angezeigt wird und es funktioniert sofort. Ich bin überrascht, dass dies auf MacPorts nicht verfügbar ist. Ich finde es so seltsam, dass ich eine BSD-Manpage für Rename (2) habe, aber beim Ausführen von rename würde es bedeuten, dass kein Befehl existiert. Stelle dir das vor.
Adamlogan
2

Befolgen Sie den Befehl, um alle Dateien in Sequenz und auch Kleinbuchstabenerweiterung umzubenennen:

rename --counter-format 000001 --lower-case --keep-extension --expr='$_ = "$N" if @EXT' *
OzzyCzech
quelle
1

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:

./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r

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

Paul Weibert
quelle
1
a=1

for i in *.jpg; do
 mv -- "$i" "$a.jpg"
 a=`expr $a + 1`
done
Shubh
quelle
1

Nehmen wir an, wir haben diese Dateien in einem Verzeichnis, das in der Reihenfolge der Erstellung aufgelistet ist, wobei die erste die älteste ist:

a.jpg
b.JPG
c.jpeg
d.tar.gz
e

ls -1crgibt dann genau die Liste oben aus. Sie können dann verwenden rename:

ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'

welche Ausgänge

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)

Die Warnung "Verwendung eines nicht initialisierten Werts […]" wird für Dateien ohne Erweiterung angezeigt. Sie können es ignorieren.

Entfernen Sie -naus dem renameBefehl, 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.

Michael Schmid
quelle
Dies war hier die nützlichste Antwort für mich, vor allem, weil ich die Operation vor dem Ausführen trocken laufen lassen wollte und weil ich die Reihenfolge durch Ändern auf ls -1tUfür die Erstellungszeit ändern konnte. Es musste auch renameinstalliert werden, was ich nicht hatte.
Antonyh
1

Wiederum mit Peros Lösung mit wenig Modifikation, da findder 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.

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 
Ruslan Gerasimov
quelle
3
Verwenden Sie dies NICHT. Die Umleitung zu einer solchen Bash ist ein massives Sicherheitsrisiko. Was ist, wenn einer der Dateinamen die Form hat blahblah; rm -r * blahblah.jpg?
Xhienne
1

Nach Zeit sortiert, beschränkt auf JPG, führende Nullen und einen Basisnamen (falls Sie wahrscheinlich eine wollen):

ls -t *.jpg | cat -n |                                           \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done

(alles in einer Zeile, ohne die \)

Frank Nocke
quelle
Nach dem großen Schema der Dinge sind viele Antworten auf dieser Seite schrecklich, daher verdient dies möglicherweise keine besondere Ablehnung. Ich zögere jedoch, alles zu verbessern, was lsin einem Skript verwendet wird.
Tripleee
Ich speichere diese Antwort von der negativen Seite, da sie zwar fragil ist, aber für einen bestimmten Anwendungsfall funktioniert, den ich hatte.
Ville
1
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'

-vn umbenennen - entferne n für den Off-Test-Modus

{$ i = 1;} - Startnummer steuern

"% 04d.jpg" - Kontrollzähler Null 04 und Ausgangserweiterung .jpg einstellen

maXp
quelle
Upvoting dieser Antwort, da nur die native Umbenennung verwendet wird. Mein Anwendungsfall war es, die ersten beiden Ziffern der Dateien durch Zahlen zu ersetzen, die um 01:rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
Minterior
1

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 Bestellung von 1 10 9 in der richtigen Reihenfolge: 1 9 10 Reihenfolge, um Probleme mit der Dateinamenerweiterung mit JPG JPG JPEG zu vermeiden
  • gawk '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ührt

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

Nintendojet
quelle
0

Sie können auch ls verwenden

ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash
bartburkhardt
quelle
5
Siehe mywiki.wooledge.org/ParsingLs sowie die Beschreibungen der Sicherheitslücken in den anderen, ähnlich defekten Lösungen.
Charles Duffy
1
Verwenden Sie dies NICHT. Die Umleitung zu einer solchen Bash ist ein massives Sicherheitsrisiko. Was ist, wenn einer der Dateinamen die Form hat blahblah; rm -r * blahblah.JPG?
Xhienne
0

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:

#!/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); 
}
Andy Beverley
quelle
0

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.jpgund führen Sie es dann zu Ihrem endgültigen Dateinamen aus.

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
Flavio Aiello
quelle
1
lsNicht nur einmal, sondern zweimal zu laufen sieht so aus, als sollte dies vermieden werden, aber ich habe es nicht eingehend untersucht.
Tripleee
1. Wenn ich absichtlich einen Oneliner vorschlage, warum ändern Sie ihn danach? Viele Benutzer wie ich ziehen es vor, einen Oneliner zu kopieren und einzufügen, um eine Aufgabe zu erledigen. Für andere, die es vorziehen, Zeile für Zeile zu kopieren, gibt es in diesem Thread andere Antworten. 2. Die ursprüngliche Frage lautete "die Anzahl der führenden Nullen in Abhängigkeit von der Gesamtanzahl der Dateien". Dies wird von der ersten lsFrage 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 bevorzugen
Flavio Aiello
1
Entschuldigung, ich habe nicht bemerkt, dass du das für wichtig hältst. Wenn ich den Code lesen kann, übertrifft dies für mich die Fähigkeit, ihn als einzelne Zeile zu kopieren / einzufügen. Ich habe keine Umgebung gefunden, in der Bash ein Problem mit einer Paste hätte, die mehrere Zeilen umfasst, aber ich übersehen möglicherweise etwas.
Tripleee
0

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

Hier habe ich Leerzeichen '' in einem Dateinamen durch '_' für alle JPG-Dateien ersetzt
#! / bin / bash
benenne 'y / / _ /' * jpg # um Leerzeichen durch _ zu ersetzen
sei x = 0;
für i in * .jpg; do
    sei x = (x + 1)
    mv $ i $ x.jpg
getan
Rishang Bhavsar
quelle
Installieren Sie die Umbenennung unter Linux (Ubuntu), "sudo apt install
rename
0

Heutzutage gibt es eine Option, nachdem Sie mehrere Dateien zum Umbenennen ausgewählt haben (ich habe im thunar-Dateimanager gesehen).

  1. Wählen Sie mehrere Dateien aus
  2. Optionen prüfen
  3. Wählen Sie Umbenennen

Eine Eingabeaufforderung wird mit allen Dateien in diesem bestimmten Verzeichnis angezeigt. Überprüfen Sie dies einfach im Kategoriebereich

rudr
quelle
-1

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.

ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash
Adam Mendoza
quelle
1
Verwenden Sie dies NICHT. Die Umleitung zu einer solchen Bash ist ein massives Sicherheitsrisiko. Was ist, wenn einer der Dateinamen die Form hat blahblah; rm -r * blahblah.mp4?
Xhienne
-1

Hier eine andere Lösung mit dem Befehl "Umbenennen":

find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'
panticz
quelle
So stellen Sie führende Nullen wieder her:rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
Camille Goudeseune
Funktioniert nicht wie erwartet für einen Ordner mit Dateien mit folgenden Namen: DSC_3451.JPG, DSC_3452.JPG usw. find -name '* .JPG' | sort -Vr | Umbenennen von 's / (\ d +) / $ 1 + 1 / ge' ändert nichts
Tiberiu C.
-2

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
Marikhu
quelle
2
Verwenden Sie dies NICHT. Die Umleitung zu einer solchen Bash ist ein massives Sicherheitsrisiko. Was ist, wenn einer der Dateinamen die Form hat blahblah; rm -r * blahblah.jpg? Nur ein extremes Beispiel.
Xhienne
-2

Wenn Sie Image Annotator zum Beschriften der Bilder verwenden.

$ make qt5py3

$ python3 labelImg.py

Soumen Sinha Mahapatra
quelle
-3

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.

Rick
quelle
1
Das OP fordert eine Reihe von Befehlen in der Unix Bourne Shell an. Sie schlagen ein kommerzielles Produkt vor, das nur in einer Windows-Umgebung ausgeführt wird.
Xhienne