Come ripulire le estensioni dei file?


9

Ho una directory con file .MP3 che vorrei modificare le estensioni in .mp3. Qual è il modo più semplice per farlo? Penso a qualcosa del genere:

find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \; 

... anche se so che non è del tutto giusto. :) La sostituzione non è corretta e non sono sicuro di come utilizzare sia a mvche un sedcomando con -execin find.

Avrei bisogno di uno script bash per questo?

Risposte:


12

Ecco un modo per farlo in Bash:

for i in *; do [ "${i/%MP3/mp3}" != "$i" ] && echo "$i" "${i/%MP3/mp3}"; done

Ho usato echoqui quindi il comando stesso non fa altro che stampare coppie di nomi di file. Se tale elenco rappresenta le modifiche che desideri apportare, puoi passare echoa qualcosa di simile mv -i --che sposterà i tuoi file (e ti chiederà prima di sovrascrivere).

Breve spiegazione:

forEsegue l' iterazione di tutti i file corrispondenti a *. Quindi, determiniamo se l'estensione è già in minuscolo, se lo è andiamo avanti, se non lo è, procediamo a spostarlo (o eco, a seconda dei casi). Questo utilizza le operazioni di stringa integrate di Bash di cui puoi leggere qui: http://tldp.org/LDP/abs/html/string-manipulation.html


Grazie per la tua risposta e indicandomi un link sulla manipolazione delle stringhe di bash!

7

In zsh:

autoload zmv
zmv '(*).MP3' '$1.mp3'   # rename files in the current directory only
zmv '(**/)(*).MP3' '$1$2.mp3'  # rename files in subdirectories as well

Per prendersi cura anche di .Mp3o .mP3file:

zmv '(**/)(*).(#i)mp3' '$1$2.mp3'

6

È possibile utilizzare il comando rename (attenzione, ci sono due implementazioni principali con API diverse) per quelle. Ad esempio, per cambiare il caso delle estensioni dei nomi di file da superiore a inferiore, provare questo:

  • con renamefrom util-linux(talvolta chiamato rename.ul), supponendo che si .JPGverifichi una sola volta nei nomi dei file

    rename -- .JPG .jpg *.JPG
  • con il renameda perl(a volte chiamato prename; sono state pubblicate diverse varianti):

    rename 's/\.JPG$/.jpg/' ./*.JPG

Ecco alcuni tutorial per ragazzi su come si è spostato da uno script bash disordinato a questo semplice comando esattamente per il tuo caso d'uso.

Un altro comando di fantasia per farlo è pax. Se stai usando ZSH per la tua shell, puoi anche usare zmv.


super! esattamente quello di cui avevo bisogno
JoshP,

Ottengo un errore syntax error at (user-supplied code), near "."quando eseguo questo comando.
Ryan Gates,

3

Usa perl-rename , coltellino svizzero di ridenominazione di file con espressioni regolari (su Ubuntu, questo è in bundle con il pacchetto perl come nome):

# Replace prename as appropriate (i.e. if you've got it installed under a different name
find /RootPath -type f -iname '*.mp3' -print0 | xargs -0 prename 's/mp3$/mp3/i'

Se sei del tipo attento, usa le opzioni -n e -v per perl rinominare per vedere cosa farà effettivamente.


Grazie per la tua risposta. Non hai perlrename sul server, ma ci giocherò più avanti oggi stesso!

0

È necessario uno script, poiché le "estensioni" in Linux sono in realtà solo parti della stringa del nome file. Devi fare un po 'di manipolazione delle stringhe nello script per ottenere il nuovo nome.

#!/bin/bash
for NAME in *.JPG
do
    PREFIX=${NAME%.*}
    NEWNAME="$PREFIX.jpg"
    mv "$NAME" "$NEWNAME"
done

La doppia virgoletta è importante se hai nomi di file con spazi bianchi. Ho pensato che alcune delle doppie citazioni fossero un po 'inosservabili.


1
Non c'è niente di sbagliato da dire nel tuo script, ma per sfida non hai bisogno di uno script per questo. Probabilmente ci sono una dozzina di modi per farlo su una riga nella maggior parte delle shell e molte utility per renderlo semplice.
Caleb,

0

In bash:

# renaming files in the current directory only
for f in *.MP3; do mv "$f" "${f%.MP3}.mp3"; done  

# renaming files in subdirectories as well
for f in *{,/*}.mp3; do mv "$f" "${f%.MP3}.mp3"; done

0

prima fai il backup dei tuoi file! puoi usare un one-liner in pitone:

python -c "import glob,os; [os.rename(fn, fn.replace('.MP3', '.mp3')) for fn in glob.glob('PATH_TO_YOUR_DIRECTORY')]"

MODIFICARE:

Ecco una spiegazione dettagliata di come funziona il one-liner. Usando python -cstiamo passando un comando all'interprete Python. Dopo aver importato le librerie osper la renamefunzione e globper l'elenco dei file, è necessario scorrere l'elenco dei file nella directory indicata, che ho chiamato PATH_TO_YOUR_DIRECTORY, ad esempio qualcosa di simile ./*a tutto nella directory corrente.

Nella sintassi one-liner purtroppo i forloop non funzionano dopo la importnotazione, quindi dobbiamo usare la notazione parentesi. Vale a dire per ogni nome di file o directory che ci globsta fornendo dal percorso indicato in forma di stringa, sostituiamo * .MP3 a * .mp3.

Poiché OP non ha menzionato la ricerca ricorsiva, non l'ho inclusa in primo luogo.

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.