2017-12-12 4 views
6

Ich versuche, einige Dateien mit einem Bash-Befehl umzubenennen, aber ich weiß nicht, wie eine arithmetische Ausdruck/mathematische Operation in die Regex-Ausdruck hinzufügen.Umbenennen von Dateien mit mathematischen Operationen

Eingang:

a000.png 
a001.png 
... 

Ouput:

a010.png 
a011.png 
... 

Ich versuche, 10, um die Namen hinzuzufügen.

Einige Dinge, die ich versucht:

rename -n -e 's/a(\d+).png/a$1 + 10.png/' * 
rename -n -e 's/a(\d+).png/a{$1 + 10}.png/' * 
rename -n -e 's/a(\d+).png/a$($1 + 10).png/' * 

Gibt es eine einfache Möglichkeit, dies zu tun?

+0

Der Trick hier ist, dass der 'rename' Befehl verwendet' perl' Syntax, anstatt 'bash' Shell-Syntax. Ich habe keine gute, umfassende Quelle zur Hand, um das auszuarbeiten, aber ich werde mich meiner Antwort anschließen, wenn ich es tue. –

+0

Ich zögere, auf eine externe Website zu verlinken; Es gibt viele Führer da draußen (eine Google-Suche entfernt). Zu Beginn können Sie mit 'man perlre' einen flüchtigen Überblick erhalten. –

Antwort

5

Dies sollte den Trick tun. Wenn Sie die führende Null nicht möchten, können Sie sprintf sowie die Formatzeichenfolge "%03d" entfernen. Wenn die Dateien, die umbenannt werden sollen, immer mit a beginnen, können Sie auch die führende Regex [a-zA-Z]* mit dem Literalzeichen a ersetzen. Schließlich, obwohl der Dateispezifizierer * angemessen sein kann, würde ich empfehlen, eine Erweiterung als zusätzliche Sicherheitsvorkehrung anzubringen (z. B. *.png).

As always, try it out first using the -n flag to verify the rename is correct.

rename -v 's/([a-zA-Z]*)([0-9]*)/$1.sprintf("%03d",$2+10)/e' * 
+0

Der Vollständigkeit halber gibt es einen * ähnlichen * (nicht doppelten) Thread über [Unix & Linux] (https://unix.stackexchange.com/questions/47006/trying-to-do-arithmetic-in-per-rename) -tool-debian), die zusätzliches Licht auf die Sache werfen können. –

+0

Das hat funktioniert, aber wenn ich viele Dateien habe, bekomme ich diesen Fehler: "a001.png nicht umbenannt: a011.png existiert bereits". Ich konnte alles in "bXXX.png" und dann wieder in "aXXX.png" umbenennen, aber gibt es einen einfacheren Weg? Ich habe mir gedacht, dass die Sortierung der Namen in umgekehrter Reihenfolge funktionieren würde "ls | sortieren -r | Umbenennen ... ", aber es hat nicht. – klaus

+2

@klaus - Ich habe mich gefragt, ob Sie auf dieses Problem stoßen würde ... Ihre' ls | sort -r' Lösung, um die Reihenfolge umzukehren _does_ Arbeit, aber Sie haben auch Um das '*' vom Ende des Befehls 'rename' zu ​​entfernen, liest es nur Dateinamen aus STDIN, wenn keine Namen als Argumente angegeben werden. –