Linuxでcpコマンドなどを使ってファイルをコピーする際に、その進捗を知りたいときが往々にしてあります。そのときに使えるコマンドを調べたので覚え書き。特に、単一で大きなファイルではなく、サブディレクトリに複数のファイルが含まれる際に合計の進捗をみたい場合です。
コマンド
rsync -ah --no-i-r --info=progress2 (コピー元) (コピー先)
出力
$ rsync -ah --no-i-r --info=progress2 (コピー元) (コピー先)
4.84G 99% 17.54MB/s 0:04:22 (xfr#30633, ir-chk=1006/34910)
4.84G: コピーが終わった分
99%: 進捗(%)
17.54MB/s: 秒間のコピー速度
0:04:22: 経過時間
xfr#30633: 30633個目のファイルを処理中
ir-chk=1006/34910: 1006は残りファイル数, 34910は合計ファイル数(スキャン中)
(irがtoになるとファイルスキャン終了。右側の数は変わらなくなる。)
オプション
-a
-rlptgoD
をつけるのと同じ意味で、コピーもととできるだけ同じ条件でコピーします。詳しくは公式マニュアルを参照。
参照: rsync(1) – Linux man page-h
--human-readable
と同義。単位をkBやMBにして読みやすくしてくれます。他のコマンドでも用意されてる例のアレですね。--progress
(今回は使わない)
進捗を表示ですが、このオプションではファイルごとの進捗になってしまい、複数のサブディレクトリが有る場合には見やすくないです。(ファイルが1つの大きなファイルとかならいいのかも)--info=progress2
rsync 3.1.0以降で使えるオプション。合計進行状況が表示できるようになったようです。--no-i-r
コピーを開始する前にファイル合計容量を計算してくれる。これなしで実行すると、進捗の%が前後して不安定です。35486ファイル、計5.8GBのフォルダに対してこのオプションを追加したところ、実行前に5秒くらいスキャンが入りました。手元でコピーする際にはそれほど時間がかかるわけではないようです。
比較
気になるのがコピーの速度。通常利用するcpコマンドと比較して遅くなっていたらあまり有用な手段ではありません。そこで、cpとrsyncの実行時間を比較してみました。
条件
- ファイル合計サイズが5.8GB(du コマンドにて)
- 総ファイル数35486個
cp --version
cp (GNU coreutils) 8.25
rsync --version
rsync version 3.1.1 protocol version 31
## それぞれの実行コマンドとtimeの出力
# 1
time cp -r src dest-cp
> 0.28s user 8.84s system 2% cpu 5:52.78 total
# 2
time rsync -ah --info=progress2 src dest-rsync
> 34.42s user 11.54s system 14% cpu 5:27.34 total
# 3
time rsync -ah --no-i-r --info=progress2 src dest-rcync2
> 35.83s user 10.28s system 15% cpu 5:03.50 total
1: cpコマンド
2: rsyncコマンド、(最初に合計容量計算なし)
3: rsyncコマンド、(最初に合計容量計算)
結果を見ると、トータルの実行時間が短い順に
3 > 2 > 1
となりました。2,3の順番が逆転してるのを見ると、、偶然かな?
かなコピーの時間はあまり変わらないといった印象です。
timeコマンドの出力の部分で、他の結果を見ると、
ユーザの実行したシステムCPU時間、システムのCPU実行時間がrsyncコマンドのほうが多く、この結果からCPU使用率がcpの2%と比べて14〜15%と高くなっています。(この%は全体の実行時間のうち、CPUを使用していた時間の割合を表しているので、通常のCPU使用率とは異なります)
システムCPU時間がコピーの際に専有されたCPU時間であると考えられるので、cpコマンドに比べて20%程多いですかね。ユーザCPU時間はアプリケーションがつかったCPU時間で、進捗を表示するための計算なんかに使われてたんじゃないかと思います。
まとめ
時間がかかる大きなファイルのコピーなどで通常のcp -r src dst
と実行すると、「本当に進んでるの?」とか「現実的な時間で完了するの?」とか不安になります。-v
オプションでは、とりあえず進んでいることはわかるかもですが、進捗的な部分がわかりません。rsync
コマンドは標準でインストールされており、また実行時間もcp
と大差ないようなので非常に有用だと思います。