私はNginxとBashでUbuntu 16.04を使用しています。 直接Zip
にデータをパイプすることは不可能であることを知っています。
たとえば、Apache/Nginxウェブサーバーでウェブサイトをホストしている場合、パスワードを入力すると、次のコマンドセットは失敗します。
drt="/var/www/html"
mysqldump -u root -p --all-databases | Zip "$drt/db-$date.Zip"
最終ファイルをZipファイルにしたい場合はどうすればよいですか?
Zip
を本当に使用したい場合は、 Jeff Schallerのトリック を使用できます。
drt="/var/www/html"
mysqldump -u root -p --all-databases | Zip "$drt/db-$date.Zip" -
これは、内容がデータベースダンプである-
という名前のファイルを含むZipファイルを作成します。これはZip
マンページで言及されています:
Zip
は、圧縮するファイルの名前として単一のダッシュ( "-")も受け入れます。この場合、標準入力からファイルが読み取られ、Zipが別のプログラムから入力を受け取ることができます。例えば:tar cf - . | Zip backup -
代わりに/dev/stdin
を使用することもできます。
mysqldump -u root -p --all-databases | Zip -FI "$drt/db-$date.Zip" /dev/stdin
これにより、dev/stdin
という名前のファイルを含むアーカイブが作成されますが、適切に処理するのが難しい場合があります。 -
は、プログラムに標準入力または標準出力を使用するように伝える一般的な省略形です。シェルが処理するものではなく、個々のプログラムでサポートされる必要があります。
どちらの場合も、おそらくfunzip
を使用してデータを抽出する必要があります。アーカイブの最初のメンバーを標準出力に抽出します。
代替の圧縮ツールを使用できる場合は、これとほぼ同じ代替手段を試してください。
drt="/var/www/html"
mysqldump -u root -p --all-databases | gzip >"$drt/db-$date.gz"
必要に応じて、gzip
をbzip2
またはxz
に置き換え、gz
からbz2
またはxz
への一般的な拡張子を使用できます。 。
本当にgzip
またはtar
を使用するよりもZipファイルを使用する場合:
drt="/var/www/html"
scratch="$(mktemp)"
if mysqldump -u root -p --all-databases > "$scratch"; then
Zip "$drt/db-$date.Zip" "$scratch"
fi
rm -f "$scratch"
オプションで、一時ディレクトリを使用して、より便利なファイル名を付けることができます。
drt="/var/www/html"
scratchdir="$(mktemp -d)"
if mysqldump -u root -p --all-databases > "${scratchdir}/db-${date}.sql"; then
Zip -j "$drt/db-$date.Zip" "${scratchdir}/db-${date}.sql"
fi
rm -rf "$scratchdir"