
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 ffmpeg
eine Ausgabe erzeugt, wird dies den Ausdruck des Fortschrittsbalkens beeinträchtigen. Sie könnten die Ausgabe umleiten, um /dev/null
sie gar nicht zu sehen, aber es kann gut sein zu wissen, ob etwas schiefgelaufen ist. Daher schlage ich vor, sie in Protokolldateien für stdout
und 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. bash
Shellscript verwenden, pv
um 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. bash
Shellscript zur Anzeige des aktuellen Fortschrittsstatus auf Anfrage
for
Schleife im Hintergrund, führen Sie dieprogram
und einen Zählercnt
while
Schleife, die nach einer Zeicheneingabe sucht (wenn jac
, 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