¿Cómo utilizar el nombre de archivo actual varias veces en un comando de canalización?

¿Cómo utilizar el nombre de archivo actual varias veces en un comando de canalización?

Estoy intentando convertir un lote de archivos .mov a mp4. ¿Cómo puedo obtener el nombre del archivo de la tubería para generar el comando ffmpeg? ¿Cómo utilizar el argumento de tubería varias veces en el eslabón de la cadena? Estoy tratando de tener algo como eso:

 ls *.MOV | ffmpeg -y -i $file  "$file.mp4"

Respuesta1

Las tuberías son útiles cuando quieres usar elsalida estándarde un comando como elentrada estándarde otro comando. Pero debe pasar un archivo como entrada ffmpeg, no nombres de archivo en su entrada estándar. Y debe ejecutarlo ffmpegvarias veces, una vez por cada archivo de entrada para obtener un archivo de salida.

En pocas palabras, las tuberías no son útiles para esto, necesita un bucle como sugiere la otra respuesta. Pero deberías poner entre comillas dobles los parámetros del nombre del archivo:

for file in *.MOV; do
    ffmpeg -y -i "$file" "$file.mp4"
done

Mencionaste en un comentario que podrías escribir un script en Perl. Eso sería realmente excesivo. Bash es un enfoque más simple y perfectamente adecuado. Tenga en cuenta que puede escribir el script anterior en una sola línea y ejecutarlo directamente en la línea de comando.

for file in *.MOV; do ffmpeg -y -i "$file" "$file.mp4"; done

Respuesta2

Podrías hacer esto usando un forbucle simple.

#!/bin/bash

for file in /path/to/*.MOV
do

    echo "Converting $file"
done

información relacionada