свернуть файл .gz и передать его для распаковки

13

Я пытаюсь загрузить некоторые .gzфайлы (но не файлы .tar.gz) с указанных URL-адресов и распаковать их, чтобы перезаписать существующие файлы, если таковые имеются.

Для каждой отдельной загрузки я пробовал следующее:

curl -O $URL | gunzip -f

Однако, это не сработало , как он потерпел неудачу с: gzip: stdin: unexpected end of file. Я выполнил серию этой команды внутри сценария оболочки bash.

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

Почему не работает конвейерная версия?

skyork
источник
1
Вы уверены, что на curl -Oсамом деле поток файлов на стандартный вывод? Возможно, вы думаете о wget -O-?
стальная водитель
@steeldriver вы должны опубликовать это как ответ curl | tar xz ...
Panther
Существует также --compressed, но это работает только для сжатых ответов.
Кенорб

Ответы:

18

Канал (представленный |символом) отправляет стандартный вывод одного процесса на стандартный ввод другого. В вашем случае вы, похоже, хотите использовать именованный файл, так что канал не подходит - в частности, нет ничего для передачи (следовательно, gunzipошибка), потому что удаленное содержимое собирается в локальный файл. Вместо этого вам нужно извлечь имя файла - например, из его URL - что-то вроде (используя встроенные в bash возможности манипулирования строками)

curl -O "$URL" && gunzip -f "${URL##*/}"

Если вы хотите использовать трубу, то способ сделать это будет что-то вроде

curl "$URL" | gunzip -c

(без -Oопции) для curlпотоковой передачи удаленного содержимого туда, stdoutкуда оно может быть передано по конвейеру gunzip, но затем вам нужно будет перенаправить gunzipвывод, чтобы перезаписать целевой несжатый файл соответствующим образом.

steeldriver
источник
6

Следуйте перенаправления при загрузке. Иногда веб-сервер имеет скрытые перенаправления по соображениям безопасности и / или случайным образом. Если вы не выполняете перенаправление, загружаются неправильные данные, и ваше приложение, считывающее передаваемые данные, запутывается. Вы можете следить за перенаправлениями с помощью curl, используя флаг -L.

curl -L https://example.com/mygzip.tar.gz | tar zxv
Джем Риссер
источник