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 等の最小環境には含まれないことがあります。
参考
- manページ:
man 1 pv - 公式サイト(Pipe Viewer): https://www.ivarch.com/programs/pv.shtml
- 使い方ガイド(英語, examples): 公式サイト “Pipe Viewer Examples”

コメント