web-dev-qa-db-ja.com

Zipファイルをパイプ処理するための回避策はありますか?

私はNginxとBashでUbuntu 16.04を使用しています。 直接Zipにデータをパイプすることは不可能であることを知っています。

たとえば、Apache/Nginxウェブサーバーでウェブサイトをホストしている場合、パスワードを入力すると、次のコマンドセットは失敗します。

drt="/var/www/html"
mysqldump -u root -p --all-databases | Zip "$drt/db-$date.Zip"

最終ファイルをZipファイルにしたい場合はどうすればよいですか?

2
user9303970

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を使用してデータを抽出する必要があります。アーカイブの最初のメンバーを標準出力に抽出します。

5
Stephen Kitt

代替の圧縮ツールを使用できる場合は、これとほぼ同じ代替手段を試してください。

drt="/var/www/html"
mysqldump -u root -p --all-databases | gzip >"$drt/db-$date.gz"

必要に応じて、gzipbzip2またはxzに置き換え、gzからbz2またはxzへの一般的な拡張子を使用できます。 。

8
roaima

本当に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"
3
DopeGhoti