나는 두 가지 대안을 제안한다

나는 두 가지 대안을 제안한다

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

간단한 해결책을 위해 이와 같은 것을 시도해 보십시오(다음이 필요합니다).tqdm패키지):

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

파일 이름에 "재미있는" 문자가 없다고 가정합니다.

답변3

나는 두 가지 대안을 제안한다

1. 진행 상황을 지속적으로 표시하는 데 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

관련 정보