Sugiero dos alternativas

Sugiero dos alternativas

¿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 ffmpegproporciona resultados, interferirá con la impresión de la barra de progreso. Puede redirigir el resultado para que /dev/nullno lo vea en absoluto, pero puede ser bueno saber si algo salió mal, por lo que sugiero redirigirlo a archivos de registro para stdouty 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. bashuso de shellscript pvpara 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. bashshellscript para mostrar el estado de progreso actual a pedido

  • forbucle en segundo plano, ejecute programy un contadorcnt
  • whilebucle 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

información relacionada