誰もこれを明確にしていないようですので、私は 2 セントを差し上げます。
ここで注意しておきたいのは、私の経験は BASH でのものであり、BASH に限定されている可能性があるため、変数とループは環境によって異なる動作をする可能性があることです。
内部に個別のファイルを含むアーカイブを作成する最善の方法は、ZIP または TAR を使用することです。私は、その単純さと可用性から、tar を使用することを好みます。
tar 自体は圧縮を行いませんが、bzip2 または gzip にバンドルすると優れた結果が得られます。あなたの例では gzip を使用しているので、デモでそれを使用します。
まず、MySQL ダンプの問題に取り組みましょう。mysqldump
コマンドはファイルを分離しません (私の知る限り)。そこで、データベースごとに 1 つのファイルを作成するための小さな回避策を考えてみましょう。
mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; done
これで、ファイルごとにデータベースを表示する文字列ができました。これらのデータベースを必要な場所にエクスポートするだけで、> 記号の後の部分を編集できます。
次に、TAR の構文を見てみましょう。
tar -czf <output-file> <input-file-1> <input-file-2>
この構成により、アーカイブする多数のファイルを指定できます。
オプションは次のように分類されます。
c - アーカイブの圧縮/作成
z - GZIP 圧縮
f - ファイルへの出力
j - bzip 圧縮
次の問題は、新しく作成されたすべてのファイルのリストを保持することです。MySQL 内で見つかった各データベースを実行しながら、while ステートメントを展開して変数に追加します。
DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB"; done
これで、作成されるすべてのファイルの出力を取得するために使用できる DBLIST 変数ができました。次に、1 行のステートメントを変更して、すべてが処理された後に tar コマンドを実行できます。
DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB"; done && tar -czf $filename "$DBLIST"
これは非常に大雑把な方法であり、手動でデータベースを指定することはできません。そのため、次のコマンドを使用して、指定したすべてのデータベースを含む TAR ファイルを作成します。
DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB.sql"; done && tar -czf $filename "$DBLIST"
MySQL データベースから MySQL データベースへのループは、次の stackoverflow.com の質問「mysqldump with db in a separate file」から来ています。これは、ニーズに合わせて単純に変更されたものです。
そして、スクリプトを 1 行で自動的にクリーンアップするには、コマンドの最後に次を追加するだけです。
&& rm "$DBLIST"
コマンドを次のようにします
DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB.sql"; done && tar -czf $filename "$DBLIST" && rm "$DBLIST"