Renommer le file masse MMV

J'ai du mal à find un motif mmv. J'ai un tas de files video avec ce model:

my.program.name.season.NN.episode.NN.-.title.avi 

et j'ai besoin de les déplacer vers:

 my.program.name.sNNeNN.title.avi 

Je n'arrive pas à avoir le bon model …

TL; DR

 rename -n 's/^((\w+\.+){3})(.).*\.(.*)\.(.).*\.(.*)\.\-(\..*)$/$1$3$4$5$6$7/' * 
  • \w+ correspond à un ou plusieurs caractères de mot, c. [a-zA-Z0-9_]+ d. [a-zA-Z0-9_]+ [1]
  • \.+ correspond à un ou plusieurs caractères point ( . ) [2]

    Notez que \. correspond à la . personnage. Nous devons utiliser \. représenter . comme . a une signification particulière dans regex. Le \ est connu comme le code d'échappement, qui restaure la signification littérale d'origine du caractère suivant.

  • (\w+\.+){3} correspond au maximum à 3 fois les précisions du groupe de caractères [1], [2] ci-dessus commençant par le début du nom du file.
    Cela correspond ou returnne my.program.name.

    Notez que des parenthèses supplémentaires autour de l'expression rationnelle sont utilisées pour le regroupement des correspondances. La concordance de regroupement commence par ( et se termine par ) et est utilisée pour fournir les references secondaires . Une reference arrière contient la sous-string correspondante stockée dans des variables spéciales $ 1 , $ 2 , , $ 9 , où $ 1 contient la sous-string correspondant à la première paire de parenthèses, etc.

  • . Le point metacharacter (.) Correspond à n'importe quel caractère. Par exemple, correspond à 3 caractères. donc avec ceci (.) nous faisons correspondre le premier caractère de season qui est s .

  • .*\. correspond à tous les éléments après un seul caractère en haut jusqu'au premier . si vu. Comme vous pouvez le voir nous ne l'avons pas capturé comme groupe de matchs parce que nous voulons supprimer cela de notre nom, où cela correspond à la eason. .

  • (.*) correspond à tout ce qui se trouve après le match ci-dessus. Cela correspond à NN . Parenthèses utilisées ici parce que nous voulons garder cela dans le nom du file.

  • \. correspond à un seul point après la correspondance ci-dessus. A. après le premier NN .

  • (.) nouveau avec celui-ci, nous faisons correspondre le premier caractère unique après le match ci-dessus. cela ne returnnera que e .

  • .*\. correspondra à tout ce qui se trouve après le match ci-dessus jusqu'au premier . . pisode. .

  • (.*) correspond à n'importe quoi après le dernier point apparié du match ci-dessus. Cela correspondra à la deuxième NN .

  • \.\- correspond à un point . suivi d'un tiret - . Correspondra ou returnnera .-

  • Et enfin (\..*)$ correspond à un seul point . et tout ce qui se termine après la fin du nom de file. $ correspond à la fin du nom de file ou de la string d'input.

Remarque: supprimez l'option -n pour effectuer un changement de nom.

Vous pouvez le faire pur BASH:

 netikras@netikras-netbook /tmp $ ls -l /tmp/*.*season.*episode.*avi -rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.07.-.title.avi -rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.32.-.title.avi -rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.35.-.title.avi -rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.NN.episode.NN.-.title.avi netikras@netikras-netbook /tmp $ for i in *.*season.*episode.*avi; do nn="${i/season./s}"; nn=${nn/.episode./e}; nn=${nn/.-./.} ; echo "moving: $i ----> $nn"; mv $i $nn; done moving: my.program.name.season.05.episode.07.-.title.avi ----> my.program.name.s05e07.title.avi moving: my.program.name.season.05.episode.32.-.title.avi ----> my.program.name.s05e32.title.avi moving: my.program.name.season.05.episode.35.-.title.avi ----> my.program.name.s05e35.title.avi moving: my.program.name.season.NN.episode.NN.-.title.avi ----> my.program.name.sNNeNN.title.avi 

De cette façon, vous n'avez pas à appeler d'applications externes, c'est-à-dire sed / awk, pour faire le travail. BASH peut facilement modifier les strings avec des outils embeddeds. Vous venez de replace 3 parties de votre nom de file et en créer un nouveau. Ensuite, tout ce qui rest est d'assigner le nouveau nom au file. Pas besoin d'apprendre une de ces expressions fantasmagoriques pour faire un travail simple.

Essayez de le faire avec le rename de perl:

 rename -n 's/ (.*?s)eason\.(\d{2})\.episode\.(\d{2})\.-\.(.*\.avi) /$1$2e$3.$4/x ' my.program.name* 

Une fois que vous êtes satisfait que cela fait ce que vous voulez, supprimez le -n pour réellement effectuer le changement de nom.