2011-08-19 20 views
41

In un ciclo come questo:Nome file senza estensione in bash per il ciclo

for f in `ls *.avi`; do echo $f; ffmpeg -i $f $f.mp3; done 

$ f sarà il nome del file completo, compresa l'estensione. Ad esempio, per song1.avi l'output del comando sarà song1.avi.mp3. C'è un modo per ottenere solo song1, senza il .avi dal ciclo for?

Immagino che ci siano modi per farlo usando awk o altri strumenti simili, ma spero che ci sia qualcosa di più semplice.

Grazie

+4

Per inciso, si vuole perdere l'inutile Uso di backtick. La sintassi corretta e idiomatica è 'for f in * .avi; do ... ' – tripleee

+0

Per non parlare - se hai spazi nei nomi dei file (anche se questa è una pratica malvagia), in realtà dovresti andare come' ls * avi | mentre leggi f; fare (...); done'. E poi cita '" $ f "' ovunque. Sto solo dicendo –

risposta

60

Usa bash parametro di espansione

${f%%.*} 

notare che è necessario la versione avidi perché ci sono più punti nel nome del file.

Da manuale bash:

$ {parametro% parola}

$ {parametro %% parola}

La parola è espansa per produrre un pattern proprio come nella espansione del nome file. Se il modello corrisponde a una parte finale del valore espanso del parametro, il risultato dell'espansione è il valore del parametro con il modello di corrispondenza più breve (il caso '%') o il modello di corrispondenza più lungo (il caso '%%') cancellato. Se parametro è '@' o '', l'operazione di rimozione del motivo viene applicata a turno a ciascun parametro posizionale e l'espansione è l'elenco risultante. Se parametro è una variabile di matrice con "@" o "", l'operazione di rimozione del motivo viene applicata a turno a ciascun membro dell'array e l'espansione è l'elenco risultante.

+28

Usa '$ {f%. *}' - se usi '$ {f %%. *}' E $ f è "one.two.avi", otterrai "uno" invece di "uno". due " –

12

Questo dovrebbe farlo:

for i in *.m4a; do 
    ffmpeg -i $i ${i%%.*}.mp3 
done 
+2

Per un'estensione nota (come nella lista' for'), puoi usare 'basename $ i .m4a' (nei backtick), ma una volta che si memorizza il'%. * '(un percento è, discutibilmente, meglio), non ti guarderai indietro di nuovo. –

+1

Questo è un po 'buggato a causa della mancanza di citazioni. Rendendolo 'ffmpeg -i" $ i "" $ {i %%. *}. Mp3 "' risolverà il supporto per i nomi di file con spazi. (A proposito, questi sono problemi che http://shellcheck.net/ può prendere). –

Problemi correlati