Я пытаюсь загрузить некоторых .gz
файлы (N.B. нет .tar.gz
) от данных URL и распаковывают их для перезаписи существующих файлов, если таковые имеются.
Для каждой отдельной загрузки я попробовал следующее:
curl -O $URL | gunzip -f
Однако это не работало, поскольку это перестало работать с: gzip: stdin: unexpected end of file
. Я выполнил ряд этой команды в сценарии оболочки удара.
Если я пролил команду в два явных шага, т.е. сначала загрузите файл и затем распакуйте .gz
файл, это работает.
Почему переданная по каналу версия не работает?
Канал (представленный |
символ), отправляет стандартный вывод одного процесса к стандартному входу другого. В Вашем случае Вы, кажется, хотите использовать именованный файл, таким образом, канал не является соответствующим - а именно, нет ничего для передачи по каналу (следовательно gunzip
ошибка), потому что удаленное содержание идет в локальный файл. Вместо этого необходимо было бы извлечь название файла - например, от его URL - что-то как (использование удара создало в возможностях обработки строк),
curl -O "$URL" && gunzip -f "${URL##*/}"
Если Вы хотите использовать канал, то способ сделать это был бы чем-то как
curl "$URL" | gunzip -c
(без -O
опция) так, чтобы curl
передает удаленное содержание потоком к stdout
от того, где это может быть передано по каналу в gunzip
, но затем необходимо было бы перенаправить gunzip
вывод для перезаписи цели распаковал файл как соответствующий.
Следуйте за перенаправлениями при загрузке. Иногда веб-сервер скрывал перенаправления для безопасности и/или случайных причин. Если Вы не следуете за перенаправлением, неправильные данные загружаются, и Ваше приложение, считывающее переданные по каналу данные, запутывается. Можно следовать за перенаправлениями с завихрением с помощью флага-L.
curl -L https://example.com/mygzip.tar.gz | tar zxv
Следующее выполняет 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