Corredor

ウェブ、プログラミングの勉強メモ。

tar で複数ファイルを圧縮する時にワイルドカードと変数を併用する

以下のように、ある DB のデータをテーブル別にファイルを毎日吐き出すディレクトリがあるとする。

$ ls -1
data-fuga01.db
data-fuga02.db
data-fuga03.db
  # …中略…
data-fuga29.db
data-fuga30.db
data-fuga31.db
data-hoge01.db
data-hoge02.db
data-hoge03.db
  # …中略…
data-hoge29.db
data-hoge30.db
data-hoge31.db

data-fuga*.dbfuga テーブルのデータを、data-hoge*.dbhoge テーブルのデータをエクスポートしたファイルで、末尾の2桁の数字は、その月の日付を表している。

こういう状況で、「その日の .db ファイルをまとめて1つの .tar.gz ファイルに圧縮するシェルスクリプトを作りたい」というのが今回の目的。


例えば今日が30日なら、data-fuga30.dbdata-hoge30.db を圧縮してまとめたいので、

$ tar -cvzf dest30.tar.gz data-fuga30.db data-hoge30.db

というコマンドを叩けば、dest30.tar.gz ファイルに圧縮してまとめられる。


当日の日付2桁は別途求めて、変数 $TODAY に格納したのだが、tar コマンドの引数でワイルドカードとの併用がうまくいかず苦戦した。

ダブルクォートで囲んだりするのはダメで、結局以下のようにした。

# 変数 $TODAY は別途用意してある
echo $TODAY
30

$ tar -cvzf dest$TODAY.gz *$(echo $TODAY).db
a data-fuga30.db
a data-hoge30.db

*$(echo $TODAY).db ココがミソ。最初のアスタリスク * でワイルドカードを指定しつつ、$(echo $TODAY) で、変数 $TODAY を出力する。コレに拡張子 .db を持つもの、ということで、最終的に *30.db という文字列を構築できた。

こうしたコマンドを持つシェルスクリプトを用意しておけば、毎日その日の日付ごとにファイルをまとめられるので、翌日31日にこのシェルスクリプトが叩かれたら *31.db に合致するファイルたちを圧縮できる、というワケだ。

他にうまいやり方あるかしら?あったら教えてください。

いちばんやさしい Linuxコマンド入門教室

いちばんやさしい Linuxコマンド入門教室