Ich habe eine Gruppe von Dateien mit dem Namentitle_Dezember_Wort1_Wort2.pngword1
und möchte das Verzeichnis und den Swap- Bereich word2
innerhalb jeder Datei durchlaufen .
d. h. gehe von button_december_state_pressed.png
->button_december_pressed_state.png
Irgendwelche Vorschläge, wie ich das erreichen könnte?
Die meisten Batchprogramme, die ich für OS X gefunden habe, können kein Zeichen zum Aufteilen von Wörtern angeben und ich hoffte, dass mir jemand mit einem kurzen Skript helfen könnte, dieses Problem zu lösen.
Antwort1
In der Bash kann dies wie folgt durchgeführt werden:
for i in *; do echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3 }' ; done
Dieser Befehl sucht zuerst alle Dateien im aktuellen Verzeichnis und gibt dann deren Namen ein (er geht davon aus,ohne zu prüfendass diese Dateinamen drei Unterstriche und einen . enthalten) an awk, das sie in der gewünschten Reihenfolge neu anordnet.
Der einzige knifflige Teil ist, dass -F'[_.]'
die Option -F' '
verwendet wird, um das Trennzeichen zwischen verschiedenen Feldern zu identifizieren. In diesem letzten Fall nimmt das Trennzeichen seinen Standardwert an, ein Leerzeichen. Die Option -F'[_.]'
definiert jedoch eine Zeichenklasse austauschbarer Elemente, in diesem Fall Unterstrich und Punkt, die nach Belieben als Trennzeichen verwendet werden können.
Bearbeiten:
Ok, da dies funktioniert, ohne tatsächlich etwas zu verschieben, können wir jetzt den eigentlichen Vorgang des Umbenennens der Dateien durchführen:
for i in *; do ni=$(echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3"."$5 }') && mv "$i" "$ni" ; done
Antwort2
Zsh undzmv
Wenn Sie zsh haben (das standardmäßig in OS X enthalten ist), können Sie verwendenzmv
:
% zsh
% autoload -U zmv
% zmv 'title_december_(*)_(*).png' 'title_december_$2_$1.png'
Würde den folgenden Befehl ausführen ( zmv -n
für einen Probelauf ohne tatsächliche Umbenennung):
mv -- title_december_word1_word2.png title_december_word2_word1.png
Natürlich können Sie etwas flexibler sein, wenn die ersten Teile bei den einzelnen Bildern unterschiedlich sind:
% zmv '(*)_(*)_(*).png' '$1_$3_$2.png'
mv -- foo_bar_word1_word2.png foo_bar_word2_word1.png
mv -- title_december_word1_word2.png title_december_word2_word1.png
Dies funktioniert, weil die Übereinstimmungen gierig sind und daher alle Unterstriche bis zum letzten vor den anderen Übereinstimmungsgruppen verschlucken.
Perl-Stilrename
Unter OS X erhalten Sierename
mitSelbstgebrautes:
$ rename -n 's/(.*)_(.*)_(.*).png/$1_$3_$2.png/' *
'foo_bar_word1_word2.png' would be renamed to 'foo_bar_word2_word1.png'
'title_december_word1_word2.png' would be renamed to 'title_december_word2_word1.png'
Die -n
Option druckt nur, was umbenannt worden wäre.