2010-01-07 20 views
20

Tôi đang cố gắng tạo tệp zip từ nội dung tệp đang được tạo đường ống, ví dụ:Làm thế nào để bạn chỉ định tên tệp trong một zip khi tạo nó trên dòng lệnh từ một đường ống?

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

Điều này viết mã zip chính xác, nhưng khi bạn mở tệp zip, tệp bên trong nó được gọi là "-". Có cách nào để chỉ định tên tệp của đường ống trong dữ liệu phải nằm trong zip không?

+1

Vui lòng không gắn thẻ câu hỏi là "thuộc về superuser" (hoặc thuộc bất kỳ nơi nào khác) - chỉ cần bỏ phiếu để di chuyển chúng. –

+0

@Neil Hoàn toàn đồng ý với bạn! –

Trả lời

5

Từ những gì tôi có thể nhóm các ngươi lại không thể làm cả hai với lệnh zip, tôi có nghĩa bạn không thể cả hai xác định tên tập tin và đường ống nội dung. Bạn có thể đặt nội dung vào đường ống và tệp kết quả là - hoặc bạn có thể đặt tên cho các tên tệp bằng [email protected].

Điều đó không có nghĩa là làm như vậy là không thể sử dụng các kỹ thuật khác. Tôi phác thảo một trong những điều dưới đây. Nó có nghĩa là bạn phải cài đặt PHP và tải phần mở rộng zip.

Có thể có rất nhiều cách khác để thực hiện. Nhưng đây là cách dễ nhất mà tôi biết. Oh và nó cũng là một lớp lót.

Đây là một ví dụ làm việc sử dụng 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 

Để chạy trên cửa sổ chỉ trao đổi dấu nháy đơn và đôi. Hoặc chỉ cần đặt tập lệnh trong một tệp.

"test.zip" là tệp Zip kết quả, "testfile" là tên của nội dung đang được đưa vào lệnh.

Kết quả từ unzip -l test.zip

Archive: test.zip 
    Length  Date Time Name 
--------- ---------- ----- ---- 
     6 01-07-2010 12:56 testfile 
---------      ------- 
     6      1 file 

Và đây là một ví dụ làm việc sử dụng 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 

Kết quả unzip -l

Archive: test5.zip 
    Length  Date Time Name 
-------- ---- ---- ---- 
     9 01-07-10 13:43 testfile2 
--------     ------- 
     9     1 file 

Kết quả unzip -p

contents 
+0

Cảm ơn - đã thử điều đó và nó hoạt động hoàn hảo! Nhiều người thích làm điều này để tiết kiệm cho các tập tin tạm thời. –

+0

Giải pháp đường ống được đặt tên bởi @ didier-trosset có vẻ chấp nhận được hơn vì nó không yêu cầu sự hiện diện của toàn bộ ngôn ngữ lập trình + thời gian chạy. – jc00ke

+0

@ jc00ke Nếu bạn quan tâm để đọc các ý kiến ​​bạn sẽ tìm hiểu rằng có những nhược điểm cho các giải pháp đường ống được đặt tên là tốt. Tôi cũng đã đưa ra ví dụ bằng hai ngôn ngữ khác nhau và rất phổ biến. Có một phần lớn các hệ thống Linux xung quanh mang theo cả hai thời gian này. Ngoài ra còn có lợi thế là phần nào độc lập với nền tảng. –

9

Bạn có thể thực hiện việc này.

ls | zip test.zip [email protected] 

điều này được thực hiện từ quan niệm rằng tôi có 3 tệp trong thư mục.

-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 

và tập tin riêng của mình, kết quả là sau đó

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 

Từ Linux trang Man Zip

Nếu danh sách tập tin được quy định như - @, zip có danh sách của các tệp đầu vào từ đầu vào tiêu chuẩn.

+5

Cảm ơn - điều đó không hoạt động khi nó là một vài tệp đang được chuyển vào, nhưng trong trường hợp này tôi đang tạo đường dẫn trong _contents_ của một tệp (trong trường hợp này là các kết quả phân cách MySQL trong tab này). Zip đủ thông minh để xử lý tệp dưới dạng tệp nhưng tôi cần biết cách gọi nội dung đó là gì trong tệp zip mà tệp tạo ra. –

+0

Vì vậy, nếu tôi hiểu bạn một cách chính xác, bạn có muốn 1 tập tin trong zipfile với tất cả các nội dung từ trận đấu sql của bạn? –

+1

Vâng, đó là chính xác –

-3

thử

mysql [params and query] | zip -q output.zip [email protected] 
+0

không có điều này sẽ không hoạt động, - @ mất một danh sách các tên tập tin từ stdin, do đó, đầu ra của mysql sẽ được hiểu là danh sách tệp. – reox

9

Bạn có thể sử dụng một đường ống có tên và gửi đầu ra yêu cầu đến nó, trong khi nén từ nó.

mkfifo output.txt ; mysql [params and query] > output.txt & zip output.zip -FI output.txt ; rm output.txt 
+0

Cảm ơn, _almost_ này hoạt động: sử dụng '& zip' tạo ra một tệp không đầy đủ; có vẻ như zip chạy trong khi không phải tất cả dữ liệu đã được flushed vào đường ống được đặt tên được nêu ra. Nếu tôi sử dụng '; zip' sau đó tất cả đều tốt. – Jens

+0

Sự cố khi sử dụng '; zip' là nó sẽ đợi lệnh 'mysql' được hoàn thành trước khi bắt đầu đọc từ đường ống có tên. Ống có tên không có công suất vô hạn. Tuy nhiên, nếu nội dung không phải là rất lớn thì không có vấn đề gì. –

4

tôi không thể quản lý với PHP answer (trong bộ nhớ trên bãi mysql lớn hơn), và FIFO đã không làm việc như tôi muốn, vì vậy giải pháp của tôi là để đổi tên các tập tin bên trong các kho lưu trữ ZIP sau khi chạy đổ, sử dụng zipnote (được bao gồm trong gói zip trên Debian).

mysql [params and query] | zip -q output.zip - 
echo -e "@ -\[email protected]=newname.sql" | zipnote -w output.zip 
Các vấn đề liên quan