¿Por qué este script bash no funciona como un servicio de automatización?

Sé muy poco sobre bash scripting o comandos de Terminal, todo esto es muy nuevo para mí, así que tengan paciencia conmigo.


Guión original

Me gustaría usar un script que encontré en littlefield.info como un servicio de automatización. Este es el guión original:

for file in *.flv *.mov *.mp4
  do mediainfo "--Inform=Video;%Duration%" $file
done | awk '{total+=$0}END{total=total/1000}END{print strftime("%H:%M:%S",total,1)}'

Explicado por el creador:

  1. Recorra cada archivo de video en una carpeta,
  2. Pasándolo al programa mediainfo para extraer la duración en milisegundos,
  3. Pasando ese resultado al programa awk para sumar todos los números para darnos un total,
  4. Pasando eso a awk nuevamente para dividir ese número por 1000 para dar la cantidad de segundos,
  5. Pasando eso a la función strftime para mostrar el resultado en formato Horas:Minutos:Segundos.

Guión modificado

Instalé la CLI de mediainfo y comencé a experimentar. Aparentemente strftimeno está disponible en Mac, así que tuve que buscar otra forma de convertir los segundos en una salida legible. Improvisé el siguiente script (probablemente terriblemente ineficiente, pero bueno... funciona):

# the cd is needed for automator
cd "$1"

i=$(for file in *.flv *.mov *.mp4
        do mediainfo "--Inform=Video;%Duration%" $file
    done | awk '{total+=$0}END{print total}')

((i/=1000, sec=i%60, i/=60, min=i%60, hrs=i/60))
timestamp=$(printf "%dh%02dm%02ds" $hrs $min $sec)
echo -e "Total duration of video files in this folder:\n\n$timestamp" > _total_duration.txt

Funciona perfectamente bien en Terminal. Pero ejecutarlo como un servicio desde Finder da el siguiente resultado:

Duración total de los archivos de video en esta carpeta:

0h00m00s

problema de variable awk

La duración no debería ser 0. Empecé a solucionar problemas y reduje el script a lo siguiente:

for file in *.flv *.mov *.mp4
    do mediainfo "--Inform=Video;%Duration%" $file
done | awk '{total+=$0}END{print total}'  > "test_file_awk.txt"

Parece que hay un problema con la variable totalen AWK. No genera nada cuando se ejecuta desde Finder, pero funciona correctamente desde Terminal.

¿Tienen alguna idea de lo que estoy haciendo mal?

Respuestas (1)

Comencemos con un pequeño ejemplo.

Inicie Automator y cree un servicio con un solo paso "Ejecutar script de shell".

Configúrelo para tomar Carpetas como entrada desde Finder

Pase la entrada como argumentos. Shell es /bin/bash

código bash:

cd "$@"

for file in *.mov *.flk *.mp4
    do
    ls -1 "$file" >> ~/Desktop/test_file_awk.txt
done

Lo que hace es que toma el directorio que pasa como "$@" y lo ingresa, luego ejecuta el comando en todos los archivos en ese directorio.

"$@" está entre comillas para proteger contra espacios, al igual que "$archivo"

Entonces, puede replicar esto en su configuración:

cd "$@"
i=$(for file in {*.flv,*.mov,*.mp4,*.m4v}
    do 
    /usr/local/bin/mediainfo "--Inform=Video;%Duration%" "$file"
done | awk '{total+=$0}END{print total}')

((i/=1000, sec=i%60, i/=60, min=i%60, hrs=i/60))
timestamp=$(printf "%dh%02dm%02ds" $hrs $min $sec)
echo -e "Total duration of video files in this folder:\n\n$timestamp" > _total_duration.txt

Personalmente, cambiaría la salida a algo como:

> ~/Desktop/"$@"_total_duration.txt

Para que los datos terminen en su escritorio en un archivo con el nombre de la carpeta, pero tengo muchos directorios de medios y no quiero archivos txt en ellos.

¡Gracias por la respuesta! Pero todavía obtengo 0h00m00s como salida. La variable iparece estar vacía . Si ejecuto esto después de la parte awk: echo "This is i: $(i)" > _total_duration.txtobtengo esto como salida: "Este es yo:"
Pruébalo ahora, funciona para mí.
¡Impresionante! Gracias un montón. ¿Por qué hay que escribir /usr/local/bin/antes del mediainfocomando en Automator y no en Terminal?
En realidad, no estoy seguro de que sea completamente necesario, pero algunos entornos de automatización (en particular, cron, autosys) no se ejecutan con un entorno de usuario completo y requerirán ese entorno cargado o rutas completas. Lo puse para estar seguro mientras estaba depurando.
Bueno, agregar la ruta completa funcionó. Así que muchas gracias :)
¡Estoy en MacOS 10.15 y la cotización cd "$@"no funciona!. Pero cd $@funciona.