26

パイプされているファイルの内容からzipファイルを作成しようとしています。

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

これによりzipが正しく書き込まれますが、zipを開くと、その中のファイルは「-」と呼ばれます。パイプされたデータのファイル名をzip内に指定する方法はありますか?

4

6 に答える 6

13

あなたはこれを行うことができます。

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のZipManページから

ファイルリストが-@として指定されている場合、zipは標準入力から入力ファイルのリストを取得します。

于 2010-01-07T10:44:33.210 に答える
13

名前付きパイプを使用して、そこから圧縮しながらリクエスト出力を送信できます。

mkfifo output.txt ; mysql [params and query] > output.txt & zip output.zip -FI output.txt ; rm output.txt
于 2010-01-07T12:19:54.890 に答える
8

PHPの回答(大きなmysqlダンプのメモリ不足)で管理できず、FIFOが希望どおりに機能していなかったため、ダンプの実行後にzipnoteを使用してZIPアーカイブ内のファイルの名前を変更することを解決します(これはDebianのzipパッケージに含まれています)。

mysql [params and query] | zip -q output.zip -
echo -e "@ -\n@=newname.sql" | zipnote -w output.zip
于 2016-12-21T12:45:07.230 に答える
5

私が収集できることから、zipコマンドで両方を行うことはできません。つまり、ファイル名を指定することとコンテンツをパイプすることの両方を行うことはできません。コンテンツをパイプして結果-のファイルをパイプするか、ファイル名を。でパイプすることができます-@

それは、他の技術を使用してそうすることが不可能であることを意味するものではありません。以下にその1つを概説します。これは、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
于 2010-01-07T11:56:12.707 に答える
2
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では、シークできないストリームへの書き込みのサポートが追加されました。

きれいではありませんが、機能します。

于 2019-05-21T18:14:20.110 に答える
-3

あなたが試すことができます:

mysql [params and query] | zip -q output.zip -@
于 2010-01-07T10:49:47.160 に答える