Вопрос или проблема
Я хочу загрузить архив 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.
Возможное Решение
-
Проблема с параметрами tar и zip: Ваша текущая логика предполагает, что tar выведет содержимое архива в стандартный вывод, а zip принимает это содержимое. Однако параметры команд используются некорректно.
-
Улучшение подхода: Вместо использования опции
-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, который будет обрабатывать возможные ошибки и очищать временные файлы.