harry’s memorandum

おれおれメモ

仕事がダラけてしまったのでシェルスクリプトでプログレスバーやってみた

やっぱ、プログレスバーがないと動いているのか分からなくてイラっとくるよね。というので、シェルスクリプトプログレスバーを簡単にできないかな、と思い書いてみた。

progress() {
  _bar=$1; _bar=${_bar:=.}
  while :
  do
    jobs %1 > /dev/null 2>&1
    [ $? = 0 ] || break
    echo -n ${_bar}
    sleep 0.1
  done;
}

usage() {
  echo "usage:$0 [command]"; exit;
}

[ $# = 0 ] && usage

"$@" &
progress

上記コードをprogress.shとして、こんな感じで時間がかかりそうな処理のコマンドを引数に渡してあげればOK.

./progress.sh sleep 10
..............................................................................................

barコマンド

しかし、探せばこんなごみコード書かなくても便利なものがあったりもする。このbarコマンドはcatのプログレスバー付きコマンドという感じです。これ、すげー便利じゃないですか。最初からこれにすればよかった。
http://www.theiling.de/projects/bar.html

まずはテストゴミファイル
dd if=/dev/urandom of=hoge.img bs=1M count=10
圧縮してバックアップ。
./bar -n  hoge.img | gzip -1 > hoge.img.gz
 91% [==============================================================......]
圧縮ファイルの展開。
./bar -n hoge.img.gz | gzip -d -c  > hoge-new.img
 85% [==========================================================..........]
ファイルのコピー。

でもこの -o オプションは 「 -o FILE (Redirects output to a file.)」 とアウトプットするファイルを指定するので、通常のcpとは順番が逆になる。 「cp source dest」 ではなく 「bar -o dest source」 間違えやすいのに間違えるとコピー元ファイルは0バイトになってしまう漢らしいシンタックスだ。

./bar-1.4$ ./bar -o dst src
 60% [=========================================...........................]

潔し、っていうコマンドはいいですね。身が引き締まります。