pv – パイプの転送量・進捗を表示(Pipe Viewer)

パイプ/リダイレクト

pv はファイルや標準入力からのデータ転送量・速度・経過時間・ETA(完了予測)などを進捗バーとして表示するコマンドです。
圧縮やコピー、バックアップなどパイプ処理の可視化や、-L による**帯域制限(スロットル)**に使われます。
実務では「pv large.log | gzip > large.log.gz」のように、長時間処理の進捗を把握・記録する用途でよく使われます。

構文(Syntax)

pv [OPTION...] [FILE...]
# 例:標準入力を監視
producer | pv [OPTION...] | consumer
  • 引数がなければ標準入力を読み取り、進捗は 標準エラー(stderr) に表示します。
  • FILE を指定した場合はそのファイルを読みつつ、内容は 標準出力(stdout) へ流します。

主なオプション一覧

オプション説明使用例
-p --progress進捗バー(%)を表示(TTY時は既定で有効)pv -p file.iso > /dev/null
-t --timer経過時間を表示`pv -t input
-e --eta完了予測時刻/残り時間(ETA)を表示pv -e file.bin > /dev/null
-r --rate転送レート(毎秒)を表示pv -r big.img > /dev/null
-b --bytes転送済みバイト数を表示pv -b file > /dev/null
-s SIZE --size SIZE総サイズを指定(stdinなどサイズ不明時のETA計算に必須)`tar cf – dir
-L RATE --rate-limit RATEレート制限k, m, g などの単位可(例: 1m=1MiB/s 目安)`pv -L 500k file
-B BYTES --buffer-size BYTES転送バッファサイズを指定`pv -B 4M in
-l --line-mode行数をカウント(テキスト処理向け)`cat access.log
-a --average-rate現在値ではなく平均レートで表示pv -a file > /dev/null
-i SEC --interval SEC進捗の更新間隔を秒指定pv -i 0.5 file > /dev/null
-N NAME --name NAME表示の先頭に名前ラベルを付与`pv -N gzip big.log
-w --width N進捗バーの幅pv -w 80 file > /dev/null
-q --quiet進捗表示を抑止(ロギング時など)`pv -q file
-f --force端末でなくても強制表示(TTY判定を無視)pv -f file > out 2>pv.log
--help / --versionヘルプ / バージョン表示pv --help

ヒント: 進捗は stderr に出ます。必要なら 2> progress.log で記録できます。

実行例

圧縮の進捗を可視化する

説明: 大きなログを gzip 圧縮しつつ、進捗・ETA・速度を確認します。
コマンド:

pv large.log | gzip > large.log.gz

出力例(概形):

2.38GiB 0:01:52 [ 22.5MiB/s] [=====>            ] 21% ETA 0:06:43

stdin の総サイズを指定して正確な ETA を出す

説明: tar はサイズがわからないため、-s に合計バイト数を与えて ETA を安定化します。
コマンド:

size=$(du -sb ./project | awk '{print $1}')
tar cf - ./project | pv -s "$size" > project.tar

帯域を制限してネットワークに優しく送る

説明: SSH で送る際に 500 KiB/s に制限します(上り輻輳の抑制)。
コマンド:

pv -L 500k big.iso | ssh user@host 'cat > big.iso'

行数ベースで進捗を確認(ログ処理など)

説明: -l行数をカウントします。-L と併用して処理速度を一定に。
コマンド:

grep -v 'WARN' app.log | pv -l -L 2000 > filtered.log
# 出力例: 125,430 0:01:02 [ 2.0k/s] [=======>      ] 62%

エラー例: 存在しない入力ファイル

説明: 入力にファイルを指定したが存在しない場合はエラーになります。
コマンド:

pv no_such_file.txt > /dev/null

出力例:

pv: no_such_file.txt: No such file or directory

関連コマンド

  • dd : 低レベルコピー。pv を前段に置くとコピー進捗を可視化できる。
  • cat : 単純連結・転送。pv と置き換えることで進捗が見える。
  • rsync : 差分コピー。自身でも進捗表示できるが、pv とパイプ連携で可視化・帯域制限の工夫が可能。
  • tar : アーカイブ作成/展開。pv をはさむとサイズ・ETAを見ながら処理可能。
  • gzip / xz : 圧縮。長時間処理の見える化に pv が有効。

備考

  • インストール: 多くのディストリでパッケージ名は pv(例: Debian/Ubuntu: sudo apt install pv、RHEL系: sudo dnf install pv、macOS: brew install pv)。最小構成のコンテナには入っていないことが多いです。
  • TTY判定: 進捗は端末接続時のみ既定で表示されます。ログしたい場合は -f で強制表示し、2> でファイルに出力します。
  • パフォーマンス: きめ細かな更新や小さすぎるバッファはオーバーヘッドになります。長時間バッチでは -i-B を適切に調整してください。
  • ETAの精度: 入力サイズが未知だと ETA は推定に依存します。正確さが必要なら -s を指定しましょう。
  • 互換性: pv は GNU coreutils ではなく独立ツールです。BusyBox 等の最小環境には含まれないことがあります。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント