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</td></tr><tr><td><!--HTMLPROTECTEDTOKEN24--> <!--HTMLPROTECTEDTOKEN25--></td><td>完了予測時刻/残り時間(ETA)を表示</td><td><!--HTMLPROTECTEDTOKEN26--></td></tr><tr><td><!--HTMLPROTECTEDTOKEN27--> <!--HTMLPROTECTEDTOKEN28--></td><td>転送レート(毎秒)を表示</td><td><!--HTMLPROTECTEDTOKEN29--></td></tr><tr><td><!--HTMLPROTECTEDTOKEN30--> <!--HTMLPROTECTEDTOKEN31--></td><td>転送済みバイト数を表示</td><td><!--HTMLPROTECTEDTOKEN32--></td></tr><tr><td><!--HTMLPROTECTEDTOKEN33--> <!--HTMLPROTECTEDTOKEN34--></td><td><strong>総サイズを指定</strong>(stdinなどサイズ不明時のETA計算に必須)</td><td>tar cf – dir
-L RATE --rate-limit RATEレート制限。k, m, g などの単位可(例: 1m=1MiB/s 目安)pv -L 500k file</td></tr><tr><td><!--HTMLPROTECTEDTOKEN41--> <!--HTMLPROTECTEDTOKEN42--></td><td>転送バッファサイズを指定</td><td>pv -B 4M in
-l --line-mode行数をカウント(テキスト処理向け)cat access.log</td></tr><tr><td><!--HTMLPROTECTEDTOKEN45--> <!--HTMLPROTECTEDTOKEN46--></td><td>現在値ではなく<strong>平均レート</strong>で表示</td><td><!--HTMLPROTECTEDTOKEN47--></td></tr><tr><td><!--HTMLPROTECTEDTOKEN48--> <!--HTMLPROTECTEDTOKEN49--></td><td>進捗の更新間隔を秒指定</td><td><!--HTMLPROTECTEDTOKEN50--></td></tr><tr><td><!--HTMLPROTECTEDTOKEN51--> <!--HTMLPROTECTEDTOKEN52--></td><td>表示の先頭に<strong>名前ラベル</strong>を付与</td><td>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玄をフォローする

コメント