Как Вы определяете имена файлов в zip при создании его на командной строке от канала?

Я пытаюсь создать zip-файл из содержания файла, которое передается по каналу в, например.

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

Это пишет zip правильно, но когда Вы открываете zip, файл в ней называют "-". Есть ли какой-либо способ определить то, чем имя файла переданного по каналу в данных должно быть в zip?

23
задан 7 January 2010 в 12:46
поделиться

4 ответа

Из того, что я могу собрать, вы не можете сделать обе команды 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-файл, "test file" - имя содержимого, которое передается в команду.

Результат распаковки -l теста. 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

Результат распаковки -l

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

Результат распаковки -p

contents
5
ответ дан 29 November 2019 в 02:25
поделиться

Вы можете попробовать:

mysql [params and query] | zip -q output.zip -@
-3
ответ дан 29 November 2019 в 02:25
поделиться

Вы можете использовать именованный канал и посылать на него вывод запроса, в то время как zipping из него.

mkfifo output.txt ; mysql [params and query] > output.txt & zip output.zip -FI output.txt ; rm output.txt
12
ответ дан 29 November 2019 в 02:25
поделиться

Вы можете это сделать.

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 принимает список входных файлов со стандартного ввода.

11
ответ дан 29 November 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: