在管道的命令行上创建文件名时,如何在zip中指定文件名?

时间:2010-01-07 10:37:40

标签: linux zip stdin pipe

我正在尝试从正在传输的文件内容中创建一个zip文件,例如

mysql [params and query] | zip -q output.zip -

这会正确写入zip,但是当您打开zip时,其中的文件称为“ - ”。有没有办法指定数据中管道的文件名应该在zip中?

6 个答案:

答案 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 -@