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

コメント