有什么办法可以管道 zip 文件吗?

有什么办法可以管道 zip 文件吗?

我使用 Ubuntu 16.04 以及 Nginx 和 Bash。我知道这是不可能的直接地将数据通过管道传输到zip.

例如,如果您在 Apache/Nginx 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"

如果您愿意,可以gzipbzip2or替换xz,典型的扩展名是gztobz2xz

答案2

如果你确实想使用zip,你可以使用杰夫·夏勒的诡计:

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,该文件可能更难正确处理。-是告诉程序使用标准输入或输出的常见简写;它不是 shell 处理的事情,它必须由每个单独的程序支持。

在这两种情况下,您可能都想使用它funzip来提取数据;它将存档的第一个成员提取到其标准输出。

答案3

如果你真的更喜欢使用 zip 文件而不是使用gzipor 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"

相关内容