2つのオプションを提案します

2つのオプションを提案します

以下のように、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

2つのオプションを提案します

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

関連情報