Ich habe ein Verzeichnis, das Bilddateien mit Namen wie enthält
image1.jpg
image2.jpg
image3.jpg
...
Leider müssen die Bildnamen nullbasiert sein, so image1.jpg
sollte es sein image0.jpg
, image2.jpg
sollte es sein image1.jpg
und so weiter.
Ich kann ein Skript schreiben, um MV-Befehle wie diese zu generieren , sie in ein Shell-Skript zu setzen und sie dann auszuführen -
mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...
Aber ich nehme an, es gibt eine bessere Möglichkeit, dies in Unix zu tun. Also, was ist es?
command-line
rename
Wir s
quelle
quelle
for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done
)imageN.jpg
nach umimage0.jpg
und fertig.Antworten:
Die gute alte Perl-Umbenennung:
[Bemerkungen]
Die Bildnummern sollten größer als 0 sein.
Wenn die Bilder größer als 9 sind und keine führenden Nullen haben, verwenden Sie diese Option,
$(ls -v1 *)
um ein Überladen zu vermeiden. Vorgeschlagen von @arielf und bemerkt von @Graeme.Im Zweifelsfall auch
-v
für ausführliche und-n
für Nichthandlungen verwenden.quelle
perlreref
0
in den Quellen nicht sein .*
am Ende mit`ls -v1 *`
und Sie sind sicherer vor Überfällen. Es geht von der niedrigsten zur höchsten Zahl.Sie können die generierten
mv
Befehle an leitenbash
. Sie müssen sie also nicht in ein Skript kopieren und ausführen. Sehen:Und alles wird ausgeführt, was weitergeleitet wird
bash
.quelle
:)
Löst das Problem, also +1.Sie können die Ausgabe iterieren, dies funktioniert für Ihr Beispiel:
Sie müssen sich auf demselben Pfad wie Ihre Dateien befinden
quelle
-i
oder-n
mitmv
, wird das Überschreiben in Randfällen verhindert.sort -V
besser?sort
wird nicht funktionieren, es wird sich zeigen,image10.jpg
bevorimage1.jpg
das ein Problem sein könnte. Du brauchstsort -nk 1.8
wie in @ Graemes Antwort.sort -V
ist eine gute Idee, werde es zu meiner Antwort hinzufügen. Es kann aber auch andere Randfälle geben, nur im Allgemeinen gute Ratschläge, um diese Art von Optionen mit Fragen wie diesen hinzuzufügen, falls jemand kopiert und am Ende Schaden anrichtet.Das Folgende scheint für alles zu funktionieren, was zum Muster passt
imageNUMBER.jpg
. Ich habeecho
vor denmv
Befehl gesetzt, um zuerst zu zeigen, was der Befehl tun würde. Um das Umbenennen tatsächlich durchzuführen, entfernen Sie einfach dieecho
In der ersten Zeile
ls image*.jpg|sort -V
werden die JPG-Dateien mit aufsteigenden Zahlen im Dateinamen aufgelistet. Diex=
Zeile extrahiert die Nummer aus dem Dateinamen. Diey=
Zeile dekrementiert dann die Zahl um eins. Der eingegebene Dateiname und diey
Nummer werden dann in demmv
Befehl verwendet, wobei das-i
Flag Sie benachrichtigt, bevor eine Datei überschrieben wird.Für meinen eigenen kleinen Test ergab dies die Ausgabe:
Persönlich würde ich vorschlagen, in einen anderen Dateinamen umzubenennen, da jetzt die Reihenfolge, in der die Dateien verarbeitet werden, einen großen Unterschied machen kann.
quelle
-i
oder-n
mitmv
, wird das Überschreiben in Randfällen verhindert.sort -n
, die-V
Option gibt es nicht.Für die Verwendung des
perl
Skriptsprename
, das zum Umbenennen in Debian-basierten Distributionen verwendet wird, ist ebenfalls GNUfind
/ erforderlichsort
. Die Dateien werden in aufsteigender Reihenfolge abgelegt, um ein Überschreiben zu verhindern.Entfernen Sie das,
-n
wenn Sie sicher sind, dass es das tut, was Sie wollen. Warnt vor bereits vorhandenen Dateien. Solange jedoch angezeigt wird, dass die Dateien in aufsteigender Reihenfolge umbenannt werden, gibt es keine Konflikte, wenn sie für real ausgeführt werden.quelle
Mit
zsh
:(entfernen,
-n
wenn Sie glücklich sind).(n)
soll die Liste numerisch sortieren,image9.jpg
wird also vorher umbenanntimage10.jpg
.quelle