Batch-Datei-Umbenennungsskript tauscht Teilzeichenfolgen im Dateinamen aus?

Batch-Datei-Umbenennungsskript tauscht Teilzeichenfolgen im Dateinamen aus?

Ich habe eine Gruppe von Dateien mit dem Namentitle_Dezember_Wort1_Wort2.pngword1und möchte das Verzeichnis und den Swap- Bereich word2innerhalb 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 -nfü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 SierenamemitSelbstgebrautes:

$ 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 -nOption druckt nur, was umbenannt worden wäre.

verwandte Informationen