ユーティリティ () がインストールされている場合はdialog
、見栄えの良いローリング ディスプレイを簡単に作成できます。
find . -type f -name glob -exec echo {} \; -exec cmd {} \; |
dialog --progressbox "Files being processed..." 12 $((COLUMNS*3/2))
への引数--progressbox
は、ボックスのタイトルです (オプション、数字のようには見えません)。テキスト行の高さとテキスト列の幅。dialog
プレゼンテーションをカスタマイズするためのオプションがたくさんあります。上記は、開始するためのものです。
dialog
「ゲージ」とも呼ばれる進行状況バーもありますが、@glennjackman が回答で指摘しているように、進行状況を表示するには、どれだけの作業が必要かを知る必要があります。これを行う 1 つの方法は、find コマンドの出力全体を収集し、その中のファイルの数を数え、蓄積された出力から目的のタスクを実行することです。ただし、これは、作業を開始するために find コマンドが終了するまで待機することを意味し、望ましくない場合があります。
興味深い課題だったという理由だけで、次の解決策を思いつきました。これは、考えられるすべてのシェルの落とし穴を回避しようとするため、過剰に設計されている可能性があります (それでも、おそらく一部が欠けている可能性があります)。これは、次の 2 つのシェル ファイルで構成されます。
# File: run.sh
#!/bin/bash
# Usage: run.sh root-directory find-tests
#
# Fix the following path as required
PROCESS="$HOME/bin/process.sh"
TD=$(mktemp --tmpdir -d gauge.XXXXXXXX)
find "$@" -print0 |
tee >(awk -vRS='\0' 'END{print NR > "'"$TD/_total"'"}';
ln -s "$TD/_total" "$TD/total") |
{ xargs -0 -n50 "$PROCESS" "$TD"; printf "XXX\n100\nDone\nXXX\n"; } |
dialog --gauge "Starting..." 7 70
rm -fR "$TD"
# File: process.sh
#!/bin/bash
TD="$1"; shift
TOTAL=
if [[ -f $TD/count ]]; then COUNT=$(cat "$TD/count"); else COUNT=0; fi
for file in "$@"; do
if [[ -z $TOTAL && -f $TD/total ]]; then TOTAL=$(cat "$TD/total"); fi
printf "XXX\n%d\nProcessing file\n%q\nXXX\n" \
$((COUNT*100/${TOTAL:-100})) "$file"
#
# do whatever you want to do with $file
#
((++COUNT))
done
echo $COUNT > "$TD/count"
いくつかのメモ:
上記にはたくさんの gnu 拡張機能が散らばっています。完全なリストは作成していませんが、確かに%q
printf 形式が含まれています (これは%s
. ファイル名リストを NUL で終了するために使用される--tmpdir
フラグと、 mktemp
.
run.sh
を使用tee
して、見つかったファイルの数を ( で) 同時にカウントし、awk
ファイルの処理を開始します。
-n50
引数を指定すると、xargs
find が最初のファイルを見つけられずに多くの時間を費やした場合に起動が遅れるのを避けるために、最初の 50 個のファイルだけを待機するようになります。必要ないかもしれません。
への-vRS='\0'
引数は、行区切り文字として aawk
を使用し、アクションを(およびオプションを) に一致させます。これはすべて、ファイルパスに改行を含めることができる場合にのみ必要です。NUL
-print0
find
-0
xargs
awk
にカウントを書き込み、完全に書き込まれる前に読み取られる非常にありそうもない競合状態を回避するために、_total
にシンボリック リンク_total
します。シンボリックリンクはアトミックであるため、この方法で行うと、存在しないか、完全に記述されていることが保証されます。total
total
total
特に処理作業がファイル サイズに関連している場合 (たとえば、圧縮など) は、ファイルを単にカウントするのではなく、ファイルの合計サイズをカウントした方がよい場合があります。それはかなり単純な変更です。また、並列実行機能を使用したくなるかもしれませんがxargs
、並列プロセス間で処理されたファイルの合計を調整する作業がもう少し必要になります。
を持っていない管理された環境を使用している場合dialog
、最も簡単な解決策はssh
、dialog
. run.sh から削除し、代わりに呼び出しに| dialog --gauge "Starting..." 7 70
入れます。ssh
ssh user@host /path/to/run.sh root-dir find-tests | dialog --gauge "Starting..." 7 70