2011-08-19 31 views
41

En un bucle como este:Nombre de archivo sin extensión en bash para el bucle

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

$ f será el nombre completo, incluyendo la extensión. Por ejemplo, para song1.avi la salida del comando será song1.avi.mp3. ¿Hay alguna forma de obtener solo la canción 1, sin el .avi del bucle for?

Imagino que hay formas de hacerlo usando awk u otras herramientas similares, pero espero que haya algo más directo.

Gracias

+4

Como acotación al margen, usted quiere perder el uso inútil de acentos abiertos. La sintaxis correcta e idiomática es 'para f in * .avi; do ... ' – tripleee

+0

Sin mencionar que si tienes espacios en los nombres de los archivos (aunque esta es una mala práctica), en realidad deberías ir como' ls * avi | mientras lee f; hacer (...); hecho'. Y luego cite '" $ f "' en todas partes. Solo digo. –

Respuesta

60

Uso fiesta parámetro de expansión

${f%%.*} 

en cuenta que necesita la versión codiciosos, porque hay varios puntos en el nombre de archivo.

De manual de bash:

$ {parámetro}% palabra

$ {parámetro %% palabra}

La palabra se expande para producir un patrón al igual que en expansión de nombre de archivo Si el patrón coincide con una porción posterior del valor expandido del parámetro, el resultado de la expansión es el valor del parámetro con el patrón de coincidencia más corto (el caso '%') o el patrón más largo que coincide (el caso '%%') borrado Si el parámetro es '@' o '', la operación de eliminación de patrón se aplica sucesivamente a cada parámetro posicional, y la expansión es la lista resultante. Si el parámetro es una variable de matriz suscrita con '@' o '', la operación de eliminación de patrón se aplica a cada miembro de la matriz sucesivamente, y la expansión es la lista resultante.

+28

Use '$ {f%. *}' - si usa '$ {f %%. *}' Y $ f es "one.two.avi", obtendrá "uno" en lugar de "uno". dos " –

12

Esto debe hacerlo:

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

Para una extensión conocida (como en la lista' for'), puede usar 'basename $ i .m4a' (en palos), pero una vez que memorice'%. * '(uno por ciento es, posiblemente, mejor), no mirarás hacia atrás otra vez. –

+1

Esto es un poco problemático debido a la falta de comillas. Haciéndolo 'ffmpeg -i" $ i "" $ {i %%. *}. Mp3 "' arreglará el soporte para nombres de archivos con espacios. (Por cierto, estos son problemas que http://shellcheck.net/ puede atrapar). –

Cuestiones relacionadas