Fichier de renommage de script de script échangeant des sous-chaînes en nom de fichier?

1

J'ai un groupe de fichiers nommé comme title_december_word1_word2.png et que je veux parcourir dans le répertoire et swap word1et word2dans chaque fichier.

c'est-à-dire aller de button_december_state_pressed.png->button_december_pressed_state.png

Toute suggestion sur la façon dont je pourrais accomplir ceci?

La plupart des programmes batch que j'ai trouvés pour OS X ne peuvent pas spécifier de caractère pour décomposer les mots et j'espérais que quelqu'un pourrait m'aider avec un script rapide pour résoudre ce problème.

utilisateur1911904
la source

Réponses:

1

En bash, cela peut être fait comme suit:

  for i in *; do echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3 }' ; done

Cette commande trouve d’abord tous les fichiers du répertoire en cours, puis alimente ces noms (elle suppose sans vérifier qu’il existe trois traits de soulignement et un. Dans ces noms de fichiers) pour awk, qui les réorganise dans l’ordre de votre choix.

La seule partie délicate est que -F'[_.]'l'option -F' 'est utilisée pour identifier le délimiteur entre différents champs. Dans ce dernier cas, le délimiteur prend sa valeur par défaut, un espace. Mais l'option -F'[_.]'définit une classe de caractères d'éléments interchangeables, dans ce cas des traits de soulignement et des points, qui peuvent être utilisés à volonté comme délimiteurs.

Modifier:

Ok, puisque cela fonctionne, sans déplacer quoi que ce soit, nous pouvons maintenant mettre en œuvre l'acte même de renommer les fichiers:

  for i in *; do ni=$(echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3"."$5 }') && mv "$i" "$ni" ; done
MariusMatutiae
la source
Cela fonctionne, mais comment puis-je maintenant appliquer ces modifications aux noms de fichiers actuels?
user1911904
D'ACCORD. Maintenant, voir mon édition.
MariusMatutiae
il est imprimé dans la fenêtre du terminal et le script se trouve dans le même répertoire que les fichiers, mais il ne fait qu'imprimer la correction, mais les fichiers eux-mêmes n'ont pas été modifiés avec de nouveaux noms.
user1911904
"renommer" ne devrait-il pas être utilisé pour changer le nom du fichier et pas seulement l'imprimer?
user1911904
@ user1911904 Désolé, j'ai oublié de dire que j'étais prudent, vous permettant de voir ce qui se passerait avant de le faire. Maintenant, mon article édité a la commande réelle. Et il utilise mv, pas renommer, ce qui est un peu différent.
MariusMatutiae
2

Zsh et zmv

Si vous avez zsh (qui est livré par défaut sous OS X), vous pouvez utiliser zmv:

% zsh
% autoload -U zmv
% zmv 'title_december_(*)_(*).png' 'title_december_$2_$1.png'

Lancerait la commande suivante (utilisez zmv -npour faire un essai à sec sans renommer):

mv -- title_december_word1_word2.png title_december_word2_word1.png

Évidemment, vous pouvez être un peu plus flexible si les premières parties sont différentes par image:

% 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

Cela fonctionne parce que les matchs sont gourmands et avalent donc tous les traits de soulignement jusqu'au dernier avant les autres groupes de matches.


À la Perl rename

Sur OS X, vous pouvez obtenir renameavec Homebrew :

$ 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'

L' -noption n'imprime que ce qui aurait été renommé.

slhck
la source