2 votos

¿Por qué hace este script de bash no como un trabajo de automator servicio?

Sé muy poco acerca de bash scripts o comandos de Terminal, todo esto es muy nuevo para mí así que por favor tengan paciencia conmigo.


Guión Original

Me gustaría utilizar una secuencia de comandos que se encuentran en littlefield.info como automator servicio. 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)}'

Se explica por el creador:

  1. Ciclo a través de cada archivo de vídeo en una carpeta,
  2. Pasando a la mediainfo programa para extraer la duración en milisegundos,
  3. Pasar el resultado a la awk programa para sumar todos los números que nos dan un total,
  4. Que pasa que a awk de nuevo a dividir ese número por 1000 para dar el número de segundos,
  5. Que pasa que a la función strftime para mostrar el resultado en Horas:Minutos:Segundos.

Modificado el script

He instalado el mediainfo CLI y comenzó a experimentar. Al parecer, strftime no está disponible en mac, por lo que tuve que buscar otra forma en cómo convertir los segundos en una salida legible. Me armó la siguiente secuencia de comandos (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 la Terminal. Pero se ejecuta como un servicio del Buscador da el siguiente resultado:

La duración Total de los archivos de vídeo en esta carpeta:

0h00m00s

awk variable problema

La duración no debe ser 0. Empecé solución de problemas, y la reducción de la secuencia de comandos 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"

No parece ser un problema con la variable total en AWK. No salida de la nada cuando se ejecuta desde el Finder, pero funciona correctamente desde la Terminal.

¿Ustedes tienen alguna idea de lo que estoy haciendo mal?

4voto

geocoin Puntos 121

Vamos a empezar con un pequeño ejemplo.

El fuego de Automator y crear un servicio con un solo "Ejecutar Script de Shell" paso.

Configurarlo para que tome las Carpetas como entrada desde el Finder.

Pase de entrada como argumentos. Shell /bin/bash

Código Bash:

cd "$@"

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

Lo que esto hace, que toma el directorio que usted pase como "$@" y pasa en él, a continuación, ejecuta el comando en todos los archivos en ese directorio.

"$@" está entre comillas para proteger en contra de los espacios, como es "$archivo"

Así, se puede replicar este a 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, me gustaría cambiar la salida a algo como:

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

De manera que la información llega a su escritorio en un archivo con el nombre de la carpeta, pero tengo un montón de directorios de medios y no quiero archivos txt en ellos.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X