
¿Existe una barra de progreso que pueda mostrar visualmente el progreso completado según la cantidad de archivos detectados encontrados y completados en un bucle for como el que se muestra a continuación?
mkdir -p hflip; for i in *.mp4; do ffmpeg -n -i "$i" -vf hflip -c:a copy hflip/"${i%.*}.mp4"; done
Respuesta1
Sugiero mantener una cadena para la barra de progreso, llenarla con algún carácter para cada archivo y reemplazarlo con otro durante el ciclo:
bar=""; for i in *.EXT; do bar=$bar-; done; for i in *.EXT; do PROGRAM OPTION1 OPTION2 "$i"; bar=${bar/-/=}; printf "%s\r" $bar; done
Pero dado que ffmpeg
proporciona resultados, interferirá con la impresión de la barra de progreso. Puede redirigir el resultado para que /dev/null
no lo vea en absoluto, pero puede ser bueno saber si algo salió mal, por lo que sugiero redirigirlo a archivos de registro para stdout
y stderr
, esta vez impreso como un script de varias líneas para hacerlo más legible. :
mkdir -p hflip
bar=""
for i in *.mp4; do
bar=$bar-
done
for i in *.mp4; do
ffmpeg -n -i "$i" -vf hflip -c:a copy hflip/"${i%.*}.mp4" > /tmp/log.out 2> /tmp/log.err
bar=${bar/-/=}
printf "%s\r" $bar
done
more /tmp/log.err
Esto mostrará el registro con todos los errores después de procesar los archivos. También puedes mostrar el log.out
, pero como se trata de ffmpeg
, le gusta mostrar muchas cosas que la mayoría de la gente no quiere leer. (-;
Respuesta2
Pruebe algo como esto para obtener una solución simple (necesita eltqdmpaquete):
for i in *.EXT; do PROGRAM OPTION1 OPTION2 "$(echo $i|tqdm)"; done
suponiendo que no haya caracteres "divertidos" en sus nombres de archivos.
Respuesta3
Sugiero dos alternativas
1. bash
uso de shellscript pv
para mostrar el progreso continuamente
Instalarpv
sudo apt install pv # in Debian and Ubuntu, other commands in other distros
Shellscript con un programa de demostración
#!/bin/bash
# if only files (if directories, you may need another command)
cnt=0
for i in dir/*
do
cnt=$((cnt+1))
done
files="$cnt"
> log
> err
for i in dir/*
do
ls "$i" >> log 2>> err # simulating the actual process
sleep 2 # simulating the actual process
echo "$i"
done | pv -l -s "$files" > /dev/null # progress view using lines with $i
Manifestación
Durante el proceso
$ ./pver
2.00 0:00:06 [0,00 /s] [===============> ] 40% ETA 0:00:09
Después de terminar
$ ./pver
5.00 0:00:10 [ 499m/s] [======================================>] 100%
2. bash
shellscript para mostrar el estado de progreso actual a pedido
for
bucle en segundo plano, ejecuteprogram
y un contadorcnt
while
bucle que busca una entrada de carácter (si es asíc
, cuéntenos sobre el progreso)
No hay barra de progreso, pero cuando lo desees, puedes obtener una actualización de estado sobre el progreso.
Shellscript con un programa de demostración
#!/bin/bash
cnt=0
echo "0" > clog
program () {
ls "$1"
sleep 5
}
# main
files=$(ls -1 dir|wc -l)
for i in dir/*
do
program "$i"
cnt=$((cnt+1))
echo "$cnt" > clog
done > log &
while [ "$cnt" != "$files" ]
do
cnt=$(cat clog)
read -sn1 -t1 chr
if [ "$chr" == "c" ]
then
echo "$cnt of $files files processed; running ..."
fi
done
echo "$cnt of $files files processed; finished :-)"
Manifestación
$ ./loop
0 of 5 files processed; running ...
3 of 5 files processed; running ...
5 of 5 files processed; finished :-)
$ cat log
dir/file1
dir/file2
dir/file3
dir/file4
dir/file w space