Я пытаюсь загрузить несколько .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
- Принудительно создает целевой каталог
- Распаковывает архив в указанный каталог.
- Заменяет корневой каталог на указанное имя каталога, просто удаляя корневой каталог архива.