2013-01-09 13 views
6

Sto scrivendo uno script Bash per ripulire la mia musica.Linux Rinomina comando maiuscolo prima lettera

volevo che formattare tutti i nomi dei file e rendendoli così con un po 'di ricerca su internet ho scritto questa linea:

sed -i -e 's/[-_]/ /g' -e 's/ \+/ /g' -e **'s/\<[a-z]/\U&/g'** -e "s/$artist //g" -e "s/$album //g" 

che ho usato per aggiungere i nomi dei file in un file di testo e poi sed ma non sapevo come applicare i nuovi nomi ai file.

Quindi ho iniziato a sperimentare con il rename e sono riuscito a ottenere lo stesso risultato eccetto per le parti in grassetto, che dovrebbe fare ogni prima lettera di una parola in maiuscolo.

rename 's/[-_]/ /g' * && rename 's/\s+/ /g' * && **rename 's/\s\w{1}/*A-Z*/g' *** && rename 's/^\d+[[:punct:]]\s//g' * && rename "s/$artist\s//g" * && rename "s/$album\s//g" * && rename "s/($ext)//g" * 

Ora, il codice di rename sta lavorando (in modo soddisfacente, almeno), trovando una sola lettera dopo un carattere di spazio, ma è la sostituzione che è problematico. Ho provato numerosi approcci diversi, lasciandomi tutti con il risultato che la prima lettera messa a fuoco viene scambiata esattamente con A-Z in questo caso.

Nella pagina di manuale di ridenominazione si dice di rendere maiuscole minuscole si fa 's/a-z/A-Z/g', ma è facile capire che si applica solo quando trova a-z A-Z. Quindi questo è quello che ho bisogno di aiuto con.

Un bonus sarebbe se qualcuno sa come farlo, come nell'esempio sed, dove il \ < corrisponde all'inizio di ogni parola, perché in questo momento, il mio comando Rinomina non si applica alla prima parola e non si applica anche se ci sono più dischi che somigliano a "Nome disco [Disco 1]" per ovvi motivi.

+0

Ho notato che continui a "disconnettersi" dai tuoi post. [Non farlo.] (Http://stackoverflow.com/faq#signatures) – chrisaycock

+0

Se hai già un file di testo con il nome sorgente e le coppie nome destinazione, 'sed 's/^/mv /' textfile | è tutto ciò di cui hai bisogno (sebbene citare nomi di file con spazi ecc. complichi le cose, questo è solo una dimostrazione di concetto, non una risposta reale). – tripleee

risposta

3

Questo sembra per l'inizio della stringa \A o per spazi \s seguito da almeno uno o più caratteri alfanumerici (a-z, 0-9, sottolineatura) \w+. Sarà maiuscolo il primo carattere di tutte le sequenze di parole.

7

Questa è una domanda di Perl, poiché rename è scritta in Perl e le istruzioni su come eseguire la ridenominazione sono un comando Perl.

In un s/// per la sostituzione sapere quale lettera inserire la versione maiuscola di, deve "catturare" la lettera dall'input. Le parentesi nel modello lo fanno, memorizzando la lettera catturata nella variabile $1. E \u in una sostituzione rende il carattere successivo maiuscolo.

modo da poter fare:

$ rename 's/\s(\w)/ \u$1/g' * 

Si noti che la parte di ricambio deve inserire uno spazio prima della lettera maiuscola, perché il modello include uno spazio e quindi sia lo spazio e la lettera originale stanno essendo sostituito. È possibile evitare questo utilizzando \b, un'asserzione a lunghezza zero, che corrisponde solo al limite di una parola:

$ rename 's/\b(\w)/\u$1/g' * 

Inoltre non è necessario il {1} in là, perché \w (come altri simboli in regexs) corrisponde a un singolo carattere per impostazione predefinita.

Infine, l'esempio rename (1) è in realtày/A-Z/a-z/, utilizzando l'operatore y///, non s///. y/// è un operatore completamente diverso, che sostituisce tutte le occorrenze di un set di lettere con un altro; non ti è utile qui, dove sono solo alcuni personaggi che vuoi creare in maiuscolo.

+0

Grazie per questa spiegazione approfondita. Mi ha aiutato moltissimo a raggiungere il mio obiettivo. Ho rifatto la mia intera formula di sostituzione e ho finito con il rename 's/(\ w) (\ w {1,})/\ u $ 1 $ 2/g' *, che cerca una lettera e la cattura in $ 1, SE e solo se quella lettera è seguita da almeno un'altra lettera, quindi capitalizza $ 1 e stampa il resto della parola usando $ 2. Ho avuto qualche problema a capire questo, con il limite \ b e ho letto che non corrispondeva a due caratteri alfabetici uno dopo l'altro, ma \ B sì, anche se non funzionava neanche ... Non sono sicuro del perché a questo punto. – Jompa

+0

"1 o più" è un requisito comune, quindi ha il proprio simbolo, '+'. Puoi scrivere '\ w +' invece di '\ w {1,}'. – Smylers

+0

'\ b' corrisponde alla transizione da un carattere word a un carattere non word (o viceversa). '\ B' è il contrario, corrispondente a qualsiasi altra parte. Quindi '/ \ b \ w \ B /' corrisponde a un carattere di parola che non deve avere un carattere di parola prima ma ha un carattere di parola dopo di esso. Il significato di 's/\ b (\ w) \ B/\ u $ 1/g' ha lo stesso effetto della tua formula, ma non si preoccupa di togliere il secondo e i successivi caratteri delle parole solo per rimetterli di nuovo in gioco. – Smylers