Sé muy poco sobre bash scripting o comandos de Terminal, todo esto es muy nuevo para mí, así que tengan paciencia conmigo.
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:
- Recorra cada archivo de video en una carpeta,
- Pasándolo al programa mediainfo para extraer la duración en milisegundos,
- Pasando ese resultado al programa awk para sumar todos los números para darnos un total,
- Pasando eso a awk nuevamente para dividir ese número por 1000 para dar la cantidad de segundos,
- Pasando eso a la función strftime para mostrar el resultado en formato Horas:Minutos:Segundos.
Instalé la CLI de mediainfo y comencé a experimentar. Aparentemente strftime
no 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
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 total
en AWK. No genera nada cuando se ejecuta desde Finder, pero funciona correctamente desde Terminal.
¿Tienen alguna idea de lo que estoy haciendo mal?
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.
Kymer
i
parece estar vacía . Si ejecuto esto después de la parte awk:echo "This is i: $(i)" > _total_duration.txt
obtengo esto como salida: "Este es yo:"Alex
Kymer
/usr/local/bin/
antes delmediainfo
comando en Automator y no en Terminal?Alex
Kymer
masisenergia
cd "$@"
no funciona!. Perocd $@
funciona.