web-dev-qa-db-fra.com

Renommer en masse des répertoires pour déplacer l'année du début à la fin

Je suis actuellement aux prises avec des dossiers de musique. Une fois, j'ai décidé de les nommer en suivant le motif: artist - album - year. J'ai réalisé aujourd'hui que ce n'était pas un choix judicieux et je souhaite maintenant nommer mes répertoires en respectant le modèle: year - artist - album, car ils apparaîtront ensuite dans l'ordre croissant lorsqu'ils seront répertoriés.

J'ai commencé à renommer à la main, mais avec environ 700 dossiers, il devait y avoir un moyen plus simple. J'ai essayé d'utiliser gprename mais je ne suis pas très bon en script regex et bash ...

Y a-t-il quelqu'un qui pourrait m'aider à épargner mon pauvre doigt?

Quelques exemples:

Aes Dana - Memory Shell - 2004 
Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009

deviendrait

2004 - Aes Dana - Memory Shell
2009 - Anja Schneider & GummiHz - Back To Back (Remixes Part 2)

EDIT: Certains noms d’artistes et d’albums ont des caractères spéciaux tels que And.Id ou Kool & The Gang. Bien que chaque répertoire ait - comme séparateur.

11
TazMayhem

En supposant que vous ayez accès à Perl rename (généralement disponible dans Ubuntu - merci à @Serg pour avoir clarifié la différence. En cas de doute, appelez /usr/bin/rename et vous devriez en obtenir le bon), vous pouvez utiliser:

rename -n 's/(.*) - (\d{4})\//$2 - $1/' */

Supprimez -n après le test pour renommer les répertoires. Cela suppose que tous les albums ont une date comprise entre 1000 et 9999. Probablement raisonnable ...

Explication

  • s/old/new remplace old par new
  • (.*) enregistrez un nombre quelconque de caractères avec le nom de $1 ultérieurement
  • (\d{4})\/ enregistrez quatre chiffres à la fin de la ligne pour qu'ils soient référencés sous le nom $2 plus tard.
  • */ correspond à tous les répertoires (pas aux fichiers - merci à @muru de l'aide!)
16
Zanna

Un simple script Python peut effectuer ce type de travail:

$ tree
.
├── Aes Dana - Memory Shell - 2004
├── Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
└── rename_dirs.py

2 directories, 1 file
$ ./rename_dirs.py */
$ tree
.
├── 2004 - Aes Dana  -  Memory Shell 
├── 2009 - Anja Schneider & GummiHz  -  Back To Back (Remixes Part 2) 
└── rename_dirs.py

Contenu du script:

#!/usr/bin/env python
from shutil import move;
import sys

for i in sys.argv[1:] :
    parts = i[:-1].split('-')
    year = parts[-1].strip()
    new_name = year + " - " + " - ".join(parts[:-1]).strip()
    move(i,new_name)

Comment ça marche:

  • L'astuce principale consiste à exécuter le script à partir du même répertoire que celui où résident les cibles. Nous passons également */ pour ne fournir que des répertoires comme arguments du script
  • Le script parcourt tous les arguments de la ligne de commande, décomposant chaque nom de fichier en une liste de chaînes avec le caractère -. Le nouveau nom de fichier est construit à partir des parties que nous avons extraites.
  • move() fonction du module shutils est ce qui renomme réellement les répertoires

Notez l'utilisation: ./rename_dirs.py */

6