Elenchi di rinominazioni di massa per spostare l'anno dalla fine all'inizio


11

Attualmente sto lottando con alcune cartelle musicali. Una volta ho deciso di assegnare loro un nome seguendo il modello: artist - album - year. Oggi mi sono reso conto che questa non era una mossa intelligente e ora voglio nominare le mie directory seguendo lo schema: year - artist - albumin quanto verranno visualizzate in ordine crescente quando elencate.

Ho iniziato a fare la ridenominazione a mano ma, con circa 700 cartelle, ci deve essere un modo più semplice; Ho provato a usare gprenamema non sono così bravo a regex e bash scripting ...

C'è qualcuno che potrebbe aiutarmi a risparmiare i miei poveri polpastrelli?

Qualche esempio:

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

potrebbe diventare

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

EDIT: alcuni nomi di artisti e album hanno caratteri speciali come And.Ido Kool & The Gang. Sebbene ogni directory abbia -come separatore.


2
Aggiungi alcuni nomi di directory di esempio e l'output previsto.
muru,

Ad esempio: ho "Aes Dana - Memory Shell - 2004" e vorrei avere "2004 - Aes Dana - Memory Shell"
TazMayhem

1
Sai come modificare la domanda, quindi perché non aggiungerla alla domanda? Inoltre, ci sono nomi dell'album o dell'artista -?
Muru,

Il nome è organizzato dal delimitatore "-" per definizione e può forse comparire altrove nel nome?
Jacob Vlijm,

Tendo a reindirizzare le cartelle di origine su un file di testo, quindi uso vim. Creo una macro per creare un secondo parametro per ogni riga con i componenti rilevanti della cartella di origine nell'ordine corretto, quindi uso un'altra macro per mettere mv all'inizio di ogni riga. Potrei anche arrivare al punto di prendere prima una copia della struttura delle cartelle nel caso in cui ho fatto un casino di / ho perso le cartelle.

Risposte:


16

Supponendo che tu abbia accesso a perl rename(generalmente disponibile in Ubuntu - grazie a @Serg per chiarire la differenza. In caso di dubbi, chiama /usr/bin/renamee dovresti ottenere quello giusto), puoi usare:

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

Rimuovere -ndopo il test per rinominare effettivamente le directory. Ciò presuppone che tutte le date degli album siano comprese tra 1000 e 9999. Probabilmente ragionevole ...

Spiegazione

  • s/old/newsostituire oldconnew
  • (.*)salva un numero qualsiasi di qualsiasi carattere come riferimento in $1seguito
  • (\d{4})\/salva quattro cifre alla fine della riga per fare riferimento come in $2seguito.
  • */ abbina tutte le directory (non i file, grazie a @muru per l'aiuto!)

3
Forse fare */solo per abbinare le directory.
Muru,

@muru sembra non funzionare! Cosa sto facendo stupidamente?
Zanna,

1
@Zanna i thin a cui si riferiscono è il fatto che alcune shell come mkshhanno un built-in chiamato rename. È sufficiente sostituirlo con il percorso completo o chiamare prenameper chiamare il nome del Perl
Sergiy Kolodyazhnyy

1
@Zanna Trovato questo bit interessante: unix.stackexchange.com/a/229248/85039 TL; DR : I renamenon sono "a volte chiamati prename" ma a quanto pare sono due "rami" dello stesso script, uno che non è mantenuto di Debian e l'altro che è. Quindi si . . è un sacco di casino - alcune shell hanno il loro rename, il pacchetto perl ha il suo renamee debian stesso fornisce un pacchetto separato
Sergiy Kolodyazhnyy

1
@Zanna Stavo pensando al programma indicato rename.ulin unix.stackexchange.com/q/229230/21167
zwol

6

Lo script Python semplice può fare questo lavoro:

$ 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

Contenuto dello 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)

Come funziona:

  • Il trucco principale è che eseguiamo script dalla stessa directory in cui risiedono le destinazioni. Passiamo anche */a fornire solo directory come argomenti per lo script
  • Lo script scorre su tutti gli argomenti della riga di comando, suddividendo ciascun nome file nell'elenco di stringhe di -caratteri. Il nuovo nome file è costruito dalle parti che abbiamo estratto.
  • move()La funzione dal shutilsmodulo è ciò che effettivamente rinomina le directory

Nota l'uso: ./rename_dirs.py */

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.