Rinomina i file con un comando a riga


10

Ho questa directory e voglio rinominare i file:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

Il risultato dovrebbe apparire così:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

Vorrei risolverlo con strumenti di shell comuni.


1
Vorrei risolverlo con strumenti di shell comuni. Non sto dicendo che non hai una buona ragione, ma confido che tu abbia fatto e risposto a una domanda a te stesso "perché?". L'ultima volta che ho avuto un problema molto simile da risolvere ho immediatamente spinto Bash da un lato e risolto in Python. Molto più semplice (ma conoscevo già Python, metodi stringa, glob.glob e os.rename - e dovevo anche ricorrere a un albero pieno di nomi di cartelle con spazi e altri caratteri scomodi, nessuno dei quali è causa di extra fastidio se si utilizza Python)
nigel222

1
@ nigel222 Sono pigro e voglio digitare il minor numero di caratteri possibile. Ecco perché non voglio usare Python qui. Non fraintendetemi. Fino ad ora Python è il mio linguaggio di programmazione preferito e lo uso quotidianamente.
Guettli,

Risposte:


18

Puoi usare rename...

rename -n 's/^[0-9]+ - //' *

Rimuovere -ndopo il test per rinominare effettivamente i file

Spiegazione

  • s/old/new/sostituire oldconnew
  • ^ inizio della stringa
  • [0-9]+ alcuni numeri

che tipo di fiore regex è supportato dallo renamestrumento. Utilizza PCRE? ... sarebbe bello.
Guettli,

5
@guettli a rigor di termini, no non è PCRE (che è Perl espressioni regolari compatibili ). Il renameè uno script Perl in modo che ha il pieno supporto alle espressioni regolari Perl; PCRE ne è solo un sottoinsieme. Tuttavia, qualsiasi cosa tu sappia da PCRE sarà applicabile a rename.
terdon,

@terdon Non mi interessa l'implementazione. Se lo guardi con gli occhiali per la matematica, allora renameha espressioni regolari compatibili perl. Sì, l'implementazione di PCRE non viene utilizzata. Ho capito questo :-) Grazie per la tua rapida risposta.
Guettli,

9

bash espansione dei parametri per eliminare la parte richiesta dall'inizio:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Forma estesa:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echoè per il funzionamento a secco; sbarazzartene per un'azione reale:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Esempio:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg

Sì, funziona. Grazie. Dato che conosco un'espressione regolare compatibile perl da Python (che uso quotidianamente), preferisco il renamecomando. (Meno digitazione necessaria).
Guettli,

1
@guettli renameè la strada da percorrere se hai familiarità con PCRE; la renamerisposta è già stata data quindi devo muovermi con puro bash. Solo per notare, pythonil modulo re(o regex) non è completamente compatibile PCRE BTW.
heemayl

@guettli Hai anche votato in basso la mia risposta? : O
heemayl

Sì, l'ho fatto e ho votato il tuo commento. Spero che tu non lo prenda sul personale. Non fraintendetemi, ma la mia opinione personale è che questo ${f#[[:digit:]]*-[[:blank:]]}è brutto. Sì funziona. Ma viviamo nel 21 ° secolo. Penso che sia tempo di passare da "funziona" a "è facile e divertente". Se "funziona" è l'obiettivo, allora Linux non perderà mai il pregiudizio di non essere user friendly. Dato che hai già ottenuto molti voti positivi, questo voto negativo non dovrebbe far male (spero). Se lo fa, dimmelo e lo riprenderò.
Guettli,

1
@guettli Qualunque cosa ti vada bene. Qui: gnu.org/software/bash/manual/html_node/… Solo per notare, la classe di personaggi [[:digit:]]ed [[:blank:]]erano lì per rispettare il tuo locale, anche questi sono abbastanza comuni in Regex.
heemayl
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.