我正在尝试从正在传输的文件内容中创建一个zip文件,例如
mysql [params and query] | zip -q output.zip -
这会正确写入zip,但是当您打开zip时,其中的文件称为“ - ”。有没有办法指定数据中管道的文件名应该在zip中?
答案 0 :(得分:11)
你可以这样做。
ls | zip test.zip -@
这是从我在目录中有3个文件的概念中完成的。
-rw-rw-r-- 1 xxx domain users 6 Jan 7 11:41 test1.txt
-rw-rw-r-- 1 xxx domain users 6 Jan 7 11:41 test2.txt
-rw-rw-r-- 1 xxx domain users 6 Jan 7 11:41 test3.txt
和文件本身,结果是
Archive: test.zip
Length Date Time Name
-------- ---- ---- ----
6 01-07-10 11:41 test1.txt
6 01-07-10 11:41 test2.txt
6 01-07-10 11:41 test3.txt
-------- -------
18 3 files
来自Linux Zip Man页面
如果文件列表指定为 - @, zip获取输入文件列表 来自标准输入。
答案 1 :(得分:11)
您可以使用命名管道,并将请求输出发送给它,同时从中拉出。
mkfifo output.txt ; mysql [params and query] > output.txt & zip output.zip -FI output.txt ; rm output.txt
答案 2 :(得分:7)
我无法使用PHP answer(更大的mysql转储内存不足),并且FIFO无法正常工作,所以我的解决方案是在运行之后重命名ZIP存档中的文件dump,使用zipnote(Debian上包含的zip包)。
mysql [params and query] | zip -q output.zip -
echo -e "@ -\n@=newname.sql" | zipnote -w output.zip
答案 3 :(得分:5)
从我可以收集到的内容中,你不能同时使用zip
命令,我的意思是你不能同时指定文件名和管道内容。您可以管道内容,结果文件为-
,也可以使用-@
管道文件名。
这并不意味着使用其他技术这样做是不可能的。我概述了下面的一个。它确实意味着您必须安装PHP并加载zip扩展名。
可能有很多其他方法可以做到这一点。但这是我所知道的最简单的。哦,这也是一个单行。
这是一个使用PHP的工作示例
echo contents | php -r '$z = new ZipArchive();$z->open($argv[1],ZipArchive::CREATE);$z->addFromString($argv[2],file_get_contents("php://stdin"));$z->close();' test.zip testfile
要在Windows上运行,只需交换单引号和双引号。或者只是将脚本放在一个文件中。
“test.zip”是生成的Zip文件,“testfile”是传递给命令的内容的名称。
来自unzip -l test.zip
Archive: test.zip
Length Date Time Name
--------- ---------- ----- ----
6 01-07-2010 12:56 testfile
--------- -------
6 1 file
这是一个使用python
的工作示例echo contents | python -c "import sys
import zipfile
z = zipfile.ZipFile(sys.argv[1],'w')
z.writestr(sys.argv[2],sys.stdin.read())
z.close()
" test5.zip testfile2
unzip -l
Archive: test5.zip
Length Date Time Name
-------- ---- ---- ----
9 01-07-10 13:43 testfile2
-------- -------
9 1 file
unzip -p
contents
答案 4 :(得分:0)
mysql [params and query] | python3 -c "import sys as s,os,zipfile as m;z=m.ZipFile(os.fdopen(s.stdout.fileno(),'wb'),'w');z.writestr(s.argv[1],s.stdin.read());z.close()" 'filename.sql' > output.zip
Python 3.5添加了对写入不可搜索流的支持。
虽然不漂亮,但是可以。
答案 5 :(得分:-3)
您可以尝试:
mysql [params and query] | zip -q output.zip -@