tar で固める際に進捗を知る

こんにちは。masm11 です。

大きなディレクトリを tar で .tar.gz に固めることってありますか? 時々ありますよね。 最近は zip の方が多いのでしょうか? 私は tar を使っています。例えば以下のようにします。

tar zcf /bak/backup.tar.gz dir

しかし、大きなディレクトリを .tar.gz にすると時間がかかるので、進捗を知りたくなります。

今回はその方法を紹介したいと思います。

まずは普通に

tar に v を付けると、ファイル名を出力してくれます。

tar zcvf /bak/backup.tar.gz dir

ですが、この場合、ファイル名とエラーメッセージが両方端末に出力されるので、 エラーの確認が難しいです。

ファイル名を別ファイルに保存する

tar zcvf /bak/backup.tar.gz dir > log

こうすると、 log にファイル名が出力されていきます。エラーメッセージは端末に出力されます。

log は別端末で

tail -f log

とでもしておけば、確認できますね。

別端末に送り込む

ファイルに出力するのが嫌な場合、別端末に直接送り込むこともできます。

端末を2枚開いて、それぞれで

tty

というコマンドを実行します。端末の ID のようなものが出力されます。 ここでは、/dev/pts/0, /dev/pts/1 だとします。

/dev/pts/0

tar zcvf /bak/backup.tar.gz dir > /dev/pts/1

と実行すると、/dev/pts/1 の方にファイル名が出力されます。エラーメッセージは /dev/pts/0 の方に出力されます。

各ファイルのサイズも見たい場合

例えば

tar ztvf /bak/backup.tar.gz

を実行すると、backup.tar.gz の中にあるファイルの、ファイル名やサイズ等が出力されます。

固めている間に見たければ、別端末でこのコマンドを何度も実行すれば、そのたびにファイル名やサイズ等が出力されますが、 backup.tar.gz は大きいので、一度見た前の方の情報は不要です。できれば、tar zcvf の時のように順次出力して欲しいです。

そこで、tail -f を使う方法を考えました。

/dev/pts/1:

echo -n '' > /bak/backup.tar.gz
tail -f /bak/backup.tar.gz | tar ztvf -

/dev/pts/0:

tar zcf /bak/backup.tar.gz dir

tar zcf で backup.tar.gz を作っていきます。backup.tar.gz が大きくなったら大きくなった部分だけ tail -f で読み取り、 tar ztvf でファイル名やサイズ等を出力しています。

ただ注意として、既に大きくなった backup.tar.gz がある場合、tail -f は後ろの方しか出力してくれないので、zcat が 「ファイル形式がおかしい」とエラーを吐きます。なので、tail -f は先に実行しておく必要があるのですが、 ファイルがなければ tail -f がエラーになりますので、最初に echo -n で空ファイルを作っています。 touch でもファイルを作れますが、もしファイルがあった場合、タイムスタンプが変わるだけになってしまうので、 明示的に空ファイルにするために echo -n にしています。

結果は以下のような感じになります。

f:id:masm11:20200715123320p:plain
実行中画面サンプル

まとめ

tar zcf で大きなディレクトリを固めている際に進捗を知る方法を紹介しました。

いろいろな方法がありますね。UNIX/Linux ではいろいろな方法があって、好みの方法を選べるところが私は好きです。

ではまた!