我使用 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"
如果您愿意,可以gzip
用bzip2
or替换xz
,典型的扩展名是gz
tobz2
或xz
。
答案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 文件而不是使用gzip
or 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"