Как вы указываете имена файлов внутри почтового индекса при создании его в командной строке из трубы? - PullRequest
23 голосов
/ 07 января 2010

Я пытаюсь создать zip-файл из содержимого файла, например,

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

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

Ответы [ 6 ]

11 голосов
/ 07 января 2010

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

mkfifo output.txt ; mysql [params and query] > output.txt & zip output.zip -FI output.txt ; rm output.txt
11 голосов
/ 07 января 2010

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

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

7 голосов
/ 21 декабря 2016

Я не смог справиться с ответом PHP (недостаточно памяти на больших дампах mysql), и FIFO не работал так, как мне хотелось, поэтому мое решение - переименовать файл в ZIP-архиве после запуска дампа используйте zipnote (который входит в состав пакета zip в Debian).

mysql [params and query] | zip -q output.zip -
echo -e "@ -\n@=newname.sql" | zipnote -w output.zip
5 голосов
/ 07 января 2010

Из того, что я могу собрать, вы не можете сделать оба с помощью команды 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
0 голосов
/ 21 мая 2019
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 добавлена ​​поддержка записи в невидимые потоки.

Это не красиво, но работает.

0 голосов
/ 07 января 2010

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

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