Создать архив (tar.gz,…) из файла, указанного через stdin

У меня возникла эта проблема при запуске образа hello-world-nginx из kitematic

Если я запустил его из терминала Docker следующим образом, я я могу просмотреть выходной HTML-код контейнера из моего браузера Windows:

docker run -p 80:80 hello-world-nginx

Параметр -p перенаправляет порт 80 на VirtualBox на порт 80 на контейнере.

1
05.05.2019, 20:02
4 ответа

Кажется, вы хотите добавить файлы в tarархив, один за другим, из стандартного вывода какой-либо другой команды.

Предполагая, что архив существует, вы можете добавить в него данный файл, используя

tar -u -f archive.tar filename

или, если вы работаете со сжатыми архивами,

tar -uz -f archive.tar.gz filename

Файл с именем filenameдолжен существовать в файловой системе. Это означает, что ваш рабочий процесс должен будет сохранить файл, а затем добавить его в архив перед повторным удалением файла.

Возможно что-то вроде этого:

somecommand filename.png >newfile1.png &&
tar -u -f archive.tar newfile1.png &&
rm newfile1.png

&&между командами гарантирует, что команда не будет запущена, если предыдущая команда по какой-либо причине не удалась.

Обратите внимание, что вам придется добавлять каждый файл с новым именем в архив, так как добавление файла с тем же именем, что и у ранее -существующего файла, «скроет» старый файл в архиве.

2
27.01.2020, 23:41

Упакуйте файл с помощью filenameс выводом какfilename.tgz

tar czf filename.tgz filename

Упаковать один или несколько из списка файлов (с)

tar czf files.tar.gz --files-from./filelist

То же самое, но другим способом

ls -1b. >./filelist && tar czf./files.tar.gz --files-from./filelist

Добавить (архив обновлений )с дополнительным файлом (s)

tar czuf./files.tar.gz./newfile

примечание:в зависимости от вашей версии tarопции могут или могут не требовать предшествующего дефиса(-)

легенда опций

  • c создать
  • z использовать gzipсжатие
  • u обновить (добавить дополнительный файл (s))
  • ftarимя файла
  • --файлы -из взять содержимое файла для списка файлов для упаковки/добавления

См. также справочную страницу tar

ХТХ

1
27.01.2020, 23:41

Вы можете легко обойти это, зайдя в файловый менеджер, щелкнув правой кнопкой мыши файл и выбрав команду «Сжать», а затем сделать его любым типом файла, который вы хотите.

0
27.01.2020, 23:41

Использование zip и bash:

cat some_file.png | zip -v --fifo archive.zip /dev/stdin
printf '%s\n' '@ dev/stdin' '@=custom_filename1.png' | zipnote -w archive.zip

# view archive contents:
unzip -l archive.zip

Archive:  archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     5200  2020-09-26 12:41   custom_filename1.png
---------                     -------
     5200                     1 file

Вы упомянули tar, но описали два ограничения:

  1. создать архив путем чтения из канала -без создания временного файла
  2. использовать широко -доступный архиватор

Ваше ограничение «нет временного файла» означает, что вы должны создать архив из канала. Tar читает только файлы -, а не каналы -, так что tar, вероятно, не годится -.

zip --fifoчитает из канала и сохраняет результат в виде файла в архиве. Zip может быть менее распространенным, чем tar, но определенно более распространенным, чем 7z.

zip читает содержимое файла из /dev/stdin:

cat some_file.png | zip -v --fifo archive.zip /dev/stdin
    zip warning: Reading FIFO (Named Pipe): /dev/stdin
  adding: dev/stdin (in=39032) (out=1468) (deflated 96%)
total bytes=39032, compressed=1468 -> 96% savings

Это сохраняет содержимое от some_file.pngдо archive.zipкак файл dev/stdin

.

Затем переименуйте сохраненный файл в custom_filename1.pngс помощью zipnote. Это действие по переименованию является атомарным -, временные файлы не создаются.

3
26.09.2020, 19:02

Теги

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