こんにちは。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
にしています。
結果は以下のような感じになります。
まとめ
tar zcf
で大きなディレクトリを固めている際に進捗を知る方法を紹介しました。
いろいろな方法がありますね。UNIX/Linux ではいろいろな方法があって、好みの方法を選べるところが私は好きです。
ではまた!