Я пытаюсь загрузить некоторые .gz
файлы (но не файлы .tar.gz
) с указанных URL-адресов и распаковать их, чтобы перезаписать существующие файлы, если таковые имеются.
Для каждой отдельной загрузки я пробовал следующее:
curl -O $URL | gunzip -f
Однако, это не сработало , как он потерпел неудачу с: gzip: stdin: unexpected end of file
. Я выполнил серию этой команды внутри сценария оболочки bash.
Если я разделил команду на два явных шага, то есть сначала загрузил файл, а затем распаковал .gz
файл, это работает.
Почему не работает конвейерная версия?
curl -O
самом деле поток файлов на стандартный вывод? Возможно, вы думаете оwget -O-
?--compressed
, но это работает только для сжатых ответов.Ответы:
Канал (представленный
|
символом) отправляет стандартный вывод одного процесса на стандартный ввод другого. В вашем случае вы, похоже, хотите использовать именованный файл, так что канал не подходит - в частности, нет ничего для передачи (следовательно,gunzip
ошибка), потому что удаленное содержимое собирается в локальный файл. Вместо этого вам нужно извлечь имя файла - например, из его URL - что-то вроде (используя встроенные в bash возможности манипулирования строками)Если вы хотите использовать трубу, то способ сделать это будет что-то вроде
(без
-O
опции) дляcurl
потоковой передачи удаленного содержимого туда,stdout
куда оно может быть передано по конвейеруgunzip
, но затем вам нужно будет перенаправитьgunzip
вывод, чтобы перезаписать целевой несжатый файл соответствующим образом.источник
Следуйте перенаправления при загрузке. Иногда веб-сервер имеет скрытые перенаправления по соображениям безопасности и / или случайным образом. Если вы не выполняете перенаправление, загружаются неправильные данные, и ваше приложение, считывающее передаваемые данные, запутывается. Вы можете следить за перенаправлениями с помощью curl, используя флаг -L.
источник