我正在尝试从正在管道输入的文件内容创建一个zip文件,例如
mysql [params and query] | zip -q output.zip -
这会正确写入zip,但是当您打开zip时,其中的文件称为" - ".有没有办法指定数据中管道的文件名应该在zip中?
您可以使用命名管道,并将请求输出发送给它,同时从中拉出.
mkfifo output.txt ; mysql [params and query] > output.txt & zip output.zip -FI output.txt ; rm output.txt
你可以这样做.
ls | zip test.zip -@
这是从我在dir中有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从标准输入中获取输入文件列表.
我无法处理PHP答案(更大的mysql转储内存不足),并且FIFO无法正常工作,所以我的解决方案是在运行转储后使用zipnote重命名ZIP存档中的文件(包含在Debian上的zip包中.
mysql [params and query] | zip -q output.zip - echo -e "@ -\n@=newname.sql" | zipnote -w output.zip
从我可以收集到的内容中,您不能同时使用该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