2011-12-18 20 views
8

Sto sviluppando un semplice launchdaemon che copia i file da una directory a un'altra. Ho ottenuto il trasferimento dei file in modo corretto.Cambia le estensioni di file di più file in una directory con terminale/bash?

Voglio solo i file nella directory di essere .mp3 di invece di di

Alcuni dei file simile a questa .dat:

6546785.8786.dat
3678685.9834.dat
4.658.679,4375. dat

voglio loro di simile a questa:

6546785.8786.mp3
3678685.9834.mp3
4658679.4375.mp3

Questo è quello che ho alla fine dello script bash per rinominare le estensioni dei file.

cd $mp3_dir 
mv *.dat *.mp3 
exit 0 

Il problema è che il file viene fuori come * .mp3, invece di 6546785.8786.mp3

e quando un altro file 6546785.8786.dat viene importato $ mp3_dir, il * .mp3 viene sovrascritto con il nuovo .mp3

Devo rinominare solo estensioni file .dat in .mp3 e mantenere il nome file.

Idee? Suggerimenti?

risposta

27

Prova:

for file in *.dat; do mv "$file" "${file%dat}mp3"; done 

Oppure, se la tua shell ha:

rename .dat .mp3 *.dat 

Ora, il motivo per cui il vostro comando non ha funzionato: prima di tutto, è più che certo che solamente aveva un file nella directory quando è stato rinominato in *.mp3, altrimenti avrebbe avuto esito negativo con *.mp3: not a directory.

E mv NON esegue alcuna magia con i file glob, è la shell che espande i glob. Il che significa che, se si ha questo file nella directory:

t.dat 

e che hai scelto:

mv *.dat *.mp3 

il guscio avrebbe ampliato *.dat-t.dat. Tuttavia, come nulla sarebbe partita *.mp3, il guscio avrebbe lasciato così com'è, cioè il comando completamente espanso è:

mv t.dat *.mp3 

Che creerà un file di nome, letteralmente, *.mp3.

Se, d'altra parte, si doveva diversi file denominati *.dat, come in:

t1.dat t2.dat 

il comando avrebbe ampliato per:

mv t1.dat t2.dat *.mp3 

Ma questa avrà esito negativo: se ci sono più di due argomenti a mv, si aspetta che l'ultimo argomento (ovvero, *.mp3) sia una directory.

+0

che ha funzionato grande. Giuro che ho pensato di aver cercato nell'intera rete la risposta giusta. Grazie mille. Ora ho bisogno di capire come nominare automaticamente questo .mp3 al nome della canzone. – CokePokes

+0

Nessun problema :) Vedi anche la modifica, c'è un altro comando più bello per farlo. E non dimenticare di accettare la risposta;) – fge

+3

+1. Se metti le variabili in "doublequote", funzionerà anche per i nomi di file con spazi. –

15

Per chiunque su un mac, questo è abbastanza facile se si dispone di BREW, se non si dispone di birra allora il mio consiglio è di farlo. poi una volta installato basta semplicemente fare questo

$ brew install rename 

poi una volta Rename è installato basta digitare (nella directory in cui i file sono)

$ rename -s dat mp3 * 
Problemi correlati