Ich habe eine Methode verwendet, um dies in Bash zu tun, basierend auf der Idee, dass wenn die Zahl im Dateinamen gerade ist, wir sie durch zwei teilen und hinzufügen wollen c2
, und wenn die Zahl ungerade ist, wollen wir eine hinzufügen und dann durch zwei teilen und hinzufügen c1
. Die getrennte Behandlung von Dateien mit ungeraden und geraden Nummern auf diese Weise ist viel länger als die Bash-Methode von Eliah Kagan, und ich stimme zu, dass die Verwendung rename
wie in dieser anderen Antwort von Eliah Kagan der kluge Weg ist, aber diese Art von Ansatz kann in einigen Situationen nützlich sein.
Ein kleiner Vorteil gegenüber der Verwendung eines Bereichs wie {0000...0012}
ist, dass nur versucht wird, vorhandene Dateien zu bearbeiten, sodass es sich nicht beschwert, wenn die Dateien nicht vorhanden sind. Sie erhalten jedoch immer noch unlogisch nummerierte Dateien, wenn Lücken vorhanden sind. Im zweiten Teil meiner Antwort finden Sie einen Weg, der dieses Problem nicht hat.
In einer Zeile sieht es schrecklich aus:
for f in *; do g="${f%.tif}"; h="${g#ome}"; if [[ $(bc <<< "$h%2") == 0 ]]; then printf -v new "ome%04dc2.tif" "$(bc <<< "$h/2")" ; echo mv -vn -- "$f" "$new"; else printf -v new "ome%04dc1.tif" "$(bc <<< "($h+1)/2")"; echo mv -vn -- "$f" "$new"; fi; done
Hier ist das als Skript:
#!/bin/bash
for f in *; do
g="${f%.tif}"
h="${g#ome}"
if [[ $(bc <<< "$h%2") == 0 ]]; then
printf -v new "ome%04dc2.tif" "$(bc <<< "$h/2")"
echo mv -vn -- "$f" "$new"
else
printf -v new "ome%04dc1.tif" "$(bc <<< "($h+1)/2")"
echo mv -vn -- "$f" "$new"
fi
done
Die echo
es vor den mv
Anweisungen dienen nur zum Testen. Entfernen Sie sie, um die Dateien tatsächlich umzubenennen, wenn Sie sehen, was Sie tun möchten.
Anmerkungen
g="${f%.tif}" # strip off the extension
h="${g#ome}" # strip off the letters... now h contains the number
Testen Sie, ob die Zahl gerade ist (dh das Teilen durch 2 ergibt keinen Rest)
if [[ $(bc <<< "$h%2") == 0 ]]; then
Ich habe verwendet bc
, das nicht versucht, Zahlen mit führenden Nullen als Oktalzahlen zu behandeln, obwohl ich die Nullen einfach mit einer anderen Zeichenfolgenerweiterung hätte entfernen können, da ich die Zahlen sowieso mit fester Breite formatieren werde.
Als nächstes konstruieren Sie den neuen Namen für die geradzahligen Dateien:
printf -v new "ome%04dc2.tif" "$(bc <<< "$h/2")"
%04d
wird durch die bc <<< "$h/2"
im 4-stelligen Format ausgegebene Zahl ersetzt , die mit führenden Nullen aufgefüllt ist (also 0 = 0000, 10 = 0010 usw.).
Benennen Sie die Originaldatei mit dem erstellten neuen Namen um
echo mv -vn -- "$f" "$new"
-v
für ausführlich, -n
für No-Clobber (überschreiben Sie keine Dateien, die bereits den beabsichtigten Namen haben, falls vorhanden) und --
um Fehler durch Dateinamen zu vermeiden, die mit beginnen -
(aber da der Rest meines Skripts erwartet, dass Ihre Dateien benannt werden, ome[somenumber].tif
denke ich, ich ' Ich füge es nur aus Gewohnheit hinzu.
Die Lücken füllen
Nach einigem Basteln und mehr Hilfe von Eliah Kagan habe ich einen prägnanteren Weg gefunden, um die Namen zu erhöhen, was den Vorteil hat, die Lücken zu füllen. Das Problem bei dieser Methode ist, dass nur eine Zahl inkrementiert, eine einfache Arithmetik für diese Zahl durchgeführt, sie formatiert und in den Dateinamen eingefügt wird. Bash denkt (sozusagen) "ok, hier ist die nächste Datei, ich gebe ihr den nächsten Namen", ohne auf den ursprünglichen Dateinamen zu achten. Dies bedeutet, dass neue Namen erstellt werden, die sich nicht auf die alten Namen beziehen , sodass Sie die Umbenennung nicht logisch rückgängig machen können und die Dateien nur dann in der richtigen Reihenfolge umbenannt werden, wenn ihre Namen bereits so sind, dass sie verarbeitet werden in der richtigen Reihenfolge. Dies ist in Ihrem Beispiel der Fall, das mit Nullen aufgefüllte Zahlen mit fester Breite enthält. Wenn Sie jedoch Dateien mit dem Namen "z.2
8
, 10
, 45
Würden sie in der Reihenfolge verarbeitet werden 10
, 2
, 45
, 8
, das ist wahrscheinlich nicht das, was Sie wollen.
Wenn dieser Ansatz angesichts all dessen für Sie geeignet ist, können Sie dies folgendermaßen tun:
i=0; for f in ome????.tif; do ((i++)); printf -v new "ome%04dc%d.tif" $(((i+1)/2)) $(((i+1)%2+1)); echo mv -vn "$f" "$new"; done
oder
#!/bin/bash
i=0
for f in ome????.tif; do
((i++))
printf -v new "ome%04dc%d.tif" $(((i+1)/2)) $(((i+1)%2+1))
echo mv -vn "$f" "$new"
done
Anmerkungen
i=0
eine Variable initiieren
((i++))
Erhöhen Sie die Variable um eins (dies zählt die Iterationen der Schleife).
printf -v new
Fügen Sie die folgende Anweisung in die Variable ein new
"ome%04dc%d.tif"
der neue Dateiname mit den Zahlenformaten, die durch die nachfolgend genannten Zahlen ersetzt werden
$(((i+1)/2))
Die Häufigkeit, mit der die Schleife ausgeführt wurde, plus eins, geteilt durch 2
Dies funktioniert auf der Grundlage, dass Bash nur eine ganzzahlige Division durchführt. Wenn wir also eine ungerade Zahl durch 2 teilen, erhalten wir dieselbe Antwort wie beim Teilen der vorhergehenden geraden Zahl durch 2:
$ echo $((2/2))
1
$ echo $((3/2))
1
$(((i+1)%2+1))
Der Rest nach dem Teilen der Häufigkeit, mit der die Schleife ausgeführt wurde, plus eins durch zwei plus eins. Dies bedeutet, wenn die Nummer der Iteration ungerade ist (z. B. der erste Lauf), ist die Ausgabe 1
, und wenn die Nummer der Iteration gerade ist (z. B. der zweite Lauf), ist die Ausgabe 2
, geben c1
oderc2
Früher habe ich , i=0
weil dann an jedem beliebigen Punkt während des Laufes, der Wert i
wird die Anzahl der Male die Schleife ausgeführt wurde , die für die Fehlersuche nützlich sein könnte , wie es auch die Ordnungsnummer der Datei verarbeitet werden wird ( das heißt , wenn i=69
wir verarbeiten die 69. Datei). Wir können die Arithmetik jedoch vereinfachen, indem wir mit einem anderen beginnen i
, zum Beispiel:
i=2; for f in ome????.tif; do printf -v new "ome%04dc%d.tif" $((i/2)) $((i%2+1)); echo mv -vn "$f" "$new"; ((i++)); done
Es gibt viele Möglichkeiten, dies zu tun :)
echo
Nur zum Testen - entfernen Sie, wenn Sie das gewünschte Ergebnis sehen.
Hier ist ein Beispiel für diese Methode:
$ ls
ome0002.tif ome0004.tif ome0007.tif ome0009.tif ome0010.tif ome0012.tif ome0019.tif ome0100.tif ome2996.tif
$ i=0; for f in ome????.tif; do ((i++)); printf -v new "ome%04dc%d.tif" $(((i+1)/2)) $(((i+1)%2+1)); echo mv -vn "$f" "$new"; done
mv -vn ome0002.tif ome0001c1.tif
mv -vn ome0004.tif ome0001c2.tif
mv -vn ome0007.tif ome0002c1.tif
mv -vn ome0009.tif ome0002c2.tif
mv -vn ome0010.tif ome0003c1.tif
mv -vn ome0012.tif ome0003c2.tif
mv -vn ome0019.tif ome0004c1.tif
mv -vn ome0100.tif ome0004c2.tif
mv -vn ome2996.tif ome0005c1.tif
(1, then 2... then 9, then 10)
Ihrer Aussage