パイプされているファイルの内容からzipファイルを作成しようとしています。
mysql [params and query] | zip -q output.zip -
これによりzipが正しく書き込まれますが、zipを開くと、その中のファイルは「-」と呼ばれます。パイプされたデータのファイル名をzip内に指定する方法はありますか?
あなたはこれを行うことができます。
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は標準入力から入力ファイルのリストを取得します。
名前付きパイプを使用して、そこから圧縮しながらリクエスト出力を送信できます。
mkfifo output.txt ; mysql [params and query] > output.txt & zip output.zip -FI output.txt ; rm output.txt
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
コマンドで両方を行うことはできません。つまり、ファイル名を指定することとコンテンツをパイプすることの両方を行うことはできません。コンテンツをパイプして結果-
のファイルをパイプするか、ファイル名を。でパイプすることができます-@
。
それは、他の技術を使用してそうすることが不可能であることを意味するものではありません。以下にその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
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では、シークできないストリームへの書き込みのサポートが追加されました。
きれいではありませんが、機能します。
あなたが試すことができます:
mysql [params and query] | zip -q output.zip -@