아래와 같이 for 루프에서 발견되어 완료된 감지된 파일 수를 기반으로 완료 진행 상황을 시각적으로 표시할 수 있는 진행률 표시줄이 있나요?
mkdir -p hflip; for i in *.mp4; do ffmpeg -n -i "$i" -vf hflip -c:a copy hflip/"${i%.*}.mp4"; done
답변1
진행률 표시줄에 문자열을 유지하고 각 파일을 일부 문자로 채우고 루프 중에 다른 문자로 바꾸는 것이 좋습니다.
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
그러나 ffmpeg
출력을 제공했기 때문에 진행률 표시줄의 인쇄를 방해하게 됩니다. 출력을 /dev/null
전혀 보지 않도록 리디렉션할 수 있지만 문제가 발생했는지 확인하는 것이 더 낫기 때문에 및 의 로그 파일로 리디렉션하는 것이 좋습니다. stdout
이번에 stderr
는 더 읽기 쉽게 만들기 위해 여러 줄 스크립트로 인쇄합니다.
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
파일을 처리한 후 모든 오류가 포함된 로그가 표시됩니다. 을 표시할 수도 있지만 log.out
이는 에 관한 것이기 때문에 ffmpeg
대부분의 사람들이 읽고 싶어하지 않는 많은 내용을 출력하는 것을 좋아합니다. (-;
답변2
이와 같은 간단한 솔루션을 시도해 보십시오(필요합니다.종합적인 품질관리팩):
for i in *.EXT; do PROGRAM OPTION1 OPTION2 "$(echo $i|tqdm)"; done
파일 이름에 "재미있는" 문자가 없다고 가정합니다.
답변3
두 가지 옵션을 제안합니다
1. Shellscript는 진행 상황을 지속적으로 표시하는 bash
데 사용됩니다.pv
설치하다pv
sudo apt install pv # in Debian and Ubuntu, other commands in other distros
데모 프로그램이 포함된 쉘스크립트
#!/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
데모
과정에서
$ ./pver
2.00 0:00:06 [0,00 /s] [===============> ] 40% ETA 0:00:09
마친 후
$ ./pver
5.00 0:00:10 [ 499m/s] [======================================>] 100%
2. bash
쉘스크립트는 요청 시 현재 진행 상태를 표시합니다.
for
백그라운드 루프에서 실행program
하고 카운터cnt
while
문자 입력을 찾는 루프(인 경우c
진행 상황을 알려주세요)
진행률 표시줄은 없지만 원할 때마다 진행 상황에 대한 상태 업데이트를 받을 수 있습니다.
데모 프로그램이 포함된 쉘스크립트
#!/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 :-)"
데모
$ ./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