curl в tar в zip не работает должным образом.

Вопрос или проблема

Я хочу загрузить архив tar.gz, извлечь его и сжать в файл zip за одну команду. Причина в том, чтобы не использовать временные файлы.

Команда, которую я использую:

curl -L "someURL" | tar xOzf - | zip -qr > /home/username/filename.zip

дает мне zip-файл, содержащий файл с именем -.

Удаление - из команды tar оставляет мне zip-файл, содержащий только небольшую часть загруженного файла, хотя само по себе это очень большой архив.

Возможно, я что-то упускаю…

Вместо извлечения загруженных файлов в стандартный вывод с помощью опции -O с tar, вы можете извлечь загруженный архив с опцией -v.

Это выведет извлеченные имена файлов с полными путями в стандартный вывод, передайте это в zip. Ваша задача будет выполнена.

curl -L "http://someurl/some.tar.gz" | tar xvzf - | zip -qr /path/to/myfile.zip -@

Здесь список файлов указывается как -@, zip берет список входных файлов из стандартного ввода вместо командной строки. Чтобы узнать больше о zip, см. man zip

Содержимое myfile.zip будет следующим:

myfile.zip
└──some
    ├── file1
    ├── file2
    ├── file3
    └── folder
        ├── file4
        ├── file5
        ├── file6
        └── file7

Все файлы и папки находятся внутри родительской папки some, которая находится в корне zip.

Как поместить все файлы и папки в корень zip

Как автор вопроса просил, чтобы все файлы находились в корне zip, в отличие от предыдущего случая, когда все эти файлы и папки были внутри папки, которая находилась в корне zip.

Используйте следующее:

curl -L "http://someurl/some.tar.gz" | tar xvzf - --strip-components=1 && zip -qr /path/to/myfile.zip *

Это создаст содержимое myfile.zip следующим образом:

myfile.zip
    ├── file1
    ├── file2
    ├── file3
    └── folder
        ├── file4
        ├── file5
        ├── file6
        └── file7

Опция --strip-components=1 с tar не извлекает первый компонент архива, то есть родительскую папку. Поэтому все файлы и папки извлекаются в текущую папку.

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

.

Ответ или решение

Если вы столкнулись с проблемой, пытаясь преобразовать tar.gz архив в zip файл с помощью одной команды, основная причина может заключаться в неправильном использовании параметров или в логике комбинированных команд. Давайте разберем текущий подход и предложим оптимальное решение.

Проблема

Вы используете команду:

curl -L "someURL" | tar xOzf - | zip -qr > /home/username/filename.zip

Эта команда, к сожалению, приводит к созданию zip-файла, содержащего файл с именем "-", что явно не является ожидаемым результатом. Причина заключается в некорректной интерпретации вывода команд tar и zip.

Возможное Решение

  1. Проблема с параметрами tar и zip: Ваша текущая логика предполагает, что tar выведет содержимое архива в стандартный вывод, а zip принимает это содержимое. Однако параметры команд используются некорректно.

  2. Улучшение подхода: Вместо использования опции -O у tar, рекомендуется выполнить извлечение с выводом имен файлов, которые затем передаются в zip.

Рекомендуемая команда выглядит следующим образом:

curl -L "http://someurl/some.tar.gz" | tar xvzf - | zip -qr /path/to/myfile.zip -@

В этом случае:

  • tar xvzf -: Параметры xvzf используются для извлечения (x) с отображением имен файлов (v) из сжатого архива (z) используя стандартный ввод (f -).
  • `zip -qr /path/to/myfile.zip -@: Параметр-@` позволяет zip считывать список файлов из стандартного ввода.

Рекомендации для размещения файлов в корне zip архива

Если вам необходимо разместить файлы в корне архива, используйте команду с дополнительным параметром:

mkdir -p /tmp/mytempdir && cd /tmp/mytempdir && curl -L "http://someurl/some.tar.gz" | tar xvzf - --strip-components=1 && zip -qr /home/username/filename.zip *

Объяснение:

  • --strip-components=1: Эта опция удаляет первый уровень в иерархии файловой системы архива, извлекая файлы прямо в текущую директорию.
  • Использование временной директории: Извлечение и упаковка файлов в zip происходит в изолированном временном каталоге, что позволяет избежать остаточных файлов после создания zip-архива.

Заключение

Оптимизация вашего процесса позволяет добиться лучшего контроля над содержимым архива, избегая нежелаемых временных файлов. Это также способствует упрощению ваших команд и уменьшению вероятности ошибок. Если требуется дальнейшая автоматизация и безопасность, можно реализовать это через скрипт bash, который будет обрабатывать возможные ошибки и очищать временные файлы.

Оцените материал
Добавить комментарий

Капча загружается...