zipファイルをパイプする方法はありますか? [コピー]

zipファイルをパイプする方法はありますか? [コピー]

NginxとBashでUbuntu 16.04を使用します。私はそれが不可能であることを知っています。まっすぐデータをzip

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

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

最終ファイルをzipファイルにしたい場合は、回避策は何ですか?

答え1

代替圧縮ツールを使用している場合は、ほぼ同じ代替方法を試してください。

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

必要に応じてまたはgzipに置き換えることができ、一般的な拡張はまたはです。bzip2xzgzbz2xz

答え2

本当に使いたい場合は、zip次のものを使用できます。Jeff SchallerのShenanigans:

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。これにより、アーカイブの最初のメンバーが標準出力に抽出されます。

答え3

もしあなたなら本物gzipまたは、以下を使用する代わりにzipファイルを使用することをお勧めしますtar

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"

関連情報