두 가지 옵션을 제안합니다

두 가지 옵션을 제안합니다

아래와 같이 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

관련 정보