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

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

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

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

curl -O $URL | gunzip -f

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

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

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

решение1

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

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

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

curl "$URL" | gunzip -c

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

решение2

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

curl -L https://example.com/mygzip.tar.gz | tar zxv

решение3

Нижеприведенное делает 3 вещи

    mkdir -p ${DIR} && curl -L http://apachemirror.wuchna.com/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz | tar zxv -C ${DIR} --strip-components 1
  1. Принудительно создает целевой каталог
  2. Распаковывает архив в указанный каталог.
  3. Заменяет корневой каталог на указанное имя каталога, просто удаляя корневой каталог архива.

Связанный контент