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*.db
は fuga
テーブルのデータを、data-hoge*.db
は hoge
テーブルのデータをエクスポートしたファイルで、末尾の2桁の数字は、その月の日付を表している。
こういう状況で、「その日の .db
ファイルをまとめて1つの .tar.gz
ファイルに圧縮するシェルスクリプトを作りたい」というのが今回の目的。
例えば今日が30日なら、data-fuga30.db
と data-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
に合致するファイルたちを圧縮できる、というワケだ。
他にうまいやり方あるかしら?あったら教えてください。