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

1

Sé muy poco acerca de las secuencias de comandos de bash o los comandos de Terminal, todo esto es muy nuevo para mí, por favor, tenga paciencia conmigo.

Script original

Me gustaría usar un script que encontré en littlefield.info como un servicio de automatización. Este es el script 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.   
  3. Pasándolo al programa mediainfo para extraer la duración en milisegundos,
  4.   
  5. Pasando ese resultado al programa awk para sumar todos los números para obtener un total,
  6.   
  7. Pasando eso a awk nuevamente para dividir ese número por 1000 para dar el número de segundos,
  8.   
  9. Pasando eso a la función strftime para mostrar el resultado en formato de Horas: Minutos: Segundos.
  10.   

Script modificado

Instalé mediainfo y comencé a experimentar. Al parecer, strftime no está disponible en mac, por lo que tuve que buscar otra forma de convertir los segundos en resultados legibles. Confeccioné el siguiente script (probablemente horriblemente 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 la 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 la variable awk

La duración no debería ser 0. Comencé a solucionar problemas y reduje la secuencia de comandos 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 total en AWK. No genera nada cuando se ejecuta desde el Finder, pero funciona correctamente desde la Terminal.

¿Tienen alguna idea de lo que estoy haciendo mal?

    
pregunta Kymer 15.08.2014 - 03:28

1 respuesta

3

Empecemos con un pequeño ejemplo.

Inicie Automator y cree un servicio con un solo paso "Ejecutar Shell Script".

Configúralo para que tome Carpetas como entrada desde el 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 esto toma el directorio que pasa como "$ @" y lo introduce, luego ejecuta el comando en todos los archivos en ese directorio.

"$ @" está entre comillas para protegerse contra espacios, al igual que "$ file"

Por lo tanto, puedes replicar esto en tu 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 de texto en ellos.

    
respondido por el Alex 15.08.2014 - 04:28

Lea otras preguntas en las etiquetas