Ich schlage zwei Alternativen vor

Ich schlage zwei Alternativen vor

Gibt es einen Fortschrittsbalken, der den Fortschritt basierend auf der Anzahl der erkannten Dateien, die in einer For-Schleife wie der folgenden gefunden und abgeschlossen wurden, visuell anzeigen kann?

mkdir -p hflip; for i in *.mp4; do ffmpeg -n -i "$i" -vf hflip -c:a copy hflip/"${i%.*}.mp4"; done

Antwort1

Ich schlage vor, einen String für den Fortschrittsbalken beizubehalten, ihn mit einigen Zeichen für jede Datei zu füllen und diese während der Schleife durch andere zu ersetzen:

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

Da Ihr jedoch ffmpegeine Ausgabe erzeugt, wird dies den Ausdruck des Fortschrittsbalkens beeinträchtigen. Sie könnten die Ausgabe umleiten, um /dev/nullsie gar nicht zu sehen, aber es kann gut sein zu wissen, ob etwas schiefgelaufen ist. Daher schlage ich vor, sie in Protokolldateien für stdoutund umzuleiten stderr, dieses Mal als mehrzeiliges Skript auszugeben, um es lesbarer zu machen:

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

Dadurch wird das Protokoll mit allen Fehlern nach der Verarbeitung der Dateien angezeigt. Sie können auch die anzeigen log.out, aber da es hier um geht ffmpeg, gibt es gerne eine Menge Zeug aus, das die meisten Leute nicht lesen möchten. (-;

Antwort2

Versuchen Sie so etwas für eine einfache Lösung (Sie benötigen dietqdmPaket):

for i in *.EXT; do PROGRAM OPTION1 OPTION2 "$(echo $i|tqdm)"; done

vorausgesetzt, Ihre Dateinamen enthalten keine „komischen“ Zeichen.

Antwort3

Ich schlage zwei Alternativen vor

1. bashShellscript verwenden, pvum den Fortschritt kontinuierlich anzuzeigen

Installierenpv

sudo apt install pv  # in Debian and Ubuntu, other commands in other distros

Shellscript mit einem Demoprogramm

#!/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

Demo

Während des Prozesses

$ ./pver
2.00  0:00:06 [0,00 /s] [===============>                        ] 40% ETA 0:00:09

Nach Abschluss

$ ./pver
5.00  0:00:10 [ 499m/s] [======================================>] 100%

2. bashShellscript zur Anzeige des aktuellen Fortschrittsstatus auf Anfrage

  • forSchleife im Hintergrund, führen Sie die programund einen Zählercnt
  • whileSchleife, die nach einer Zeicheneingabe sucht (wenn ja c, dann informiere uns über den Fortschritt)

Es gibt keinen Fortschrittsbalken, Sie können jedoch jederzeit ein Statusupdate zum Fortschritt erhalten.

Shellscript mit einem Demoprogramm

#!/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 :-)"

Demo

$ ./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

verwandte Informationen