Я пытаюсь создать zip-файл из содержания файла, которое передается по каналу в, например.
mysql [params and query] | zip -q output.zip -
Это пишет zip правильно, но когда Вы открываете zip, файл в ней называют "-". Есть ли какой-либо способ определить то, чем имя файла переданного по каналу в данных должно быть в zip?
Из того, что я могу собрать, вы не можете сделать обе команды 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
Вы можете попробовать:
mysql [params and query] | zip -q output.zip -@
Вы можете использовать именованный канал и посылать на него вывод запроса, в то время как zipping из него.
mkfifo output.txt ; mysql [params and query] > output.txt & zip output.zip -FI output.txt ; rm output.txt
Вы можете это сделать.
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 принимает список входных файлов со стандартного ввода.