スクリプト用の一度に1行の作業進捗フィルタ

スクリプト用の一度に1行の作業進捗フィルタ

ファイルグループを処理し、さまざまな種類のタスクを実行できるスクリプトがあるとします。

作業中にファイル名を印刷すると、状況がどのように進行しているかを追跡するのに役立ちます。

ただし、データ量は、スクリプトがどの段階にあるかなどの他の情報を圧倒する可能性があります。

私が望むのは、stdinを読み、改行をボックスリターンとtermcapシーケンスに変更して、行の最後まで内容を消去することです。 (または戻り、間隔の最終幅、および別の戻り)

この機能を使用すると、さまざまなステップの出力がスクロールなしで変更される単一行として表示されます(改行がない限り、ああ、一度に1つの質問)。

これを書くことはできますが、誰かが以前にやったことがあるほど便利ですが、フィルタ名が何であるかわかりません。

もう終わりましたか?

someprogram | dialog --progressbox 1 80(私が探しているものに近いものを使う)

答え1

あなたが望むのは、スクロールせずに更新され続ける進行線を持つことだと思います。これについて私が書いた内容は次のとおりです。

files="$(ls /some/folder)"
elems="$(echo "$files" | wc -w)"
cnt=0
for name in $files; do
    let "cnt+=1"
    printf "\rMyScript - Processing file %3i of %3i: %.40s" "$cnt" "$elems" "$name"
done
echo

たとえば、行が提供されますMyScrpit - Processing file 5 of 14: foo.a

次のようにパイプラインを介して機能するように変更することもできますdialog --progressbox

total="$1"
cnt=0
while IFS='$\n' read -r name; do
    let "cnt+=1"
    printf "\rProcessing file %3i of %3i: %.40s" "$cnt" "$total" "$name"
done < /dev/stdin
echo

もちろん、カウンターを省略してファイル名のみを印刷することができます(合計数を引数としてあらかじめ提供したくない場合)。
printfの固定フィールド長は、折り返さないようにします(ターミナルウィンドウが小さくない限り)。

関連情報