Я должен скачать файл по этой ссылке . Загрузочный файл представляет собой zip-файл, который мне нужно будет распаковать в текущую папку.
Обычно я сначала загружаю его, затем запускаю команду unzip.
$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
$ unzip temp.zip
Но, таким образом, мне нужно выполнить две команды, дождаться завершения первой, чтобы выполнить следующую, также я должен знать имя файла, temp.zip
которому он будет передан unzip
.
Можно ли перенаправить вывод wget
на unzip
? Что-то вроде
$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834`
Но это не сработало.
bash
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
:: неоднозначный редирект
Кроме того, wget
был выполнен дважды, и загрузил файл дважды.
command-line
io-redirection
Andrew-Dufresne
источник
источник
Ответы:
Вы должны загрузить свои файлы во временный файл, потому что (цитируя распакованную man-страницу):
Просто соберите команды:
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip; unzip temp.zip; rm temp.zip
Но для того, чтобы сделать его более гибким, вы, вероятно, должны поместить его в скрипт, чтобы сохранить некоторую типизацию и, чтобы убедиться, что вы случайно не перезаписали что-либо, вы можете использовать
mktemp
команду для создания безопасного имени файла для вашего временного файла:источник
wget file.zip && unzip file.zip
такой жеwget file.zip; unzip file.zip
или один предпочтительным по сравнению с другим? Спасибо :)wget && unzip
будет запускать распаковку только в случае успеха wget.wget ; unzip
в любом случае будет запускать распаковку, возможно, указывая на несуществующий файл.Это перепост моего ответа на похожий вопрос:
Формат файла ZIP включает в себя каталог (индекс) в конце архива. В этом каталоге указывается, где в архиве находится каждый файл, и, таким образом, обеспечивается быстрый произвольный доступ без чтения всего архива.
Это может создать проблему при попытке чтения ZIP-архива через канал, поскольку доступ к индексу не осуществляется до самого конца, и поэтому отдельные элементы не могут быть правильно извлечены до тех пор, пока файл не будет полностью прочитан и больше не доступен , Таким образом, неудивительно, что большинство декомпрессоров ZIP просто терпят неудачу, когда архив подается по каналу.
Каталог в конце архива - не единственное место, где метаинформация файла хранится в архиве. Кроме того, отдельные записи также включают эту информацию в локальный заголовок файла для целей резервирования.
Хотя не каждый ZIP-распаковщик будет использовать локальные заголовки файлов, когда индекс недоступен, внешние интерфейсы tar и cpio для libarchive (также известные как bsdtar и bsdcpio) могут и будут делать это при чтении через канал, что означает следующее:
источник
.zip
-файл, который содержит файлы с разрешениями на выполнение. Когда я загружаю и загружаюbsdtar
, исполняемые биты выбрасываются. Когда я загружаю на диск и извлекаю с помощьюbsdtar
илиunzip
затем, исполняемые биты соблюдаются.bsdtar
открывается ли файл, можно искать или нет, он использует одно или другое место.Если у вас установлен JDK, вы можете использовать
jar
:источник
jar
не сохраняет права доступа к файлам. Хороший трюк в противном случае.| jar xv
Я не думаю, что вы даже хотите докучать о выводе wget в распаковку.
Из статьи в википедии "ZIP (формат файла)" :
wget должен полностью завершить загрузку, прежде чем unzip сможет выполнить какую-либо работу, поэтому они запускаются последовательно, а не переплетаются, как можно подумать.
источник
Правильный синтаксис будет:
но это не сработает из-за ошибки ( Info-ZIP на Debian ):
или на BSD / OS X:
Это связано с тем, что стандартные zip-инструменты в основном используют
lseek
функцию , чтобы установить смещение файла в конце для чтения его конца записи центрального каталога . Он расположен в конце структуры архива и необходим для чтения списка файлов (см .: Структура формата файла Zip ). Поэтому файл не может быть FIFO, каналом, оконечным устройством или любой другой динамикой, потому что входной объект не может быть позиционированlseek
функцией.Итак, у вас есть следующие обходные пути:
tar.gz
),источник
Репост моего ответа :
BusyBox
unzip
может взять stdin и извлечь все файлы.Тире после
unzip
- использовать stdin в качестве входных данных.Вы можете даже,
Но это просто избыточно
unzip file.zip
.Если ваш дистрибутив по умолчанию использует BusyBox (например, Alpine), просто запустите
unzip -
.источник
Это работает для меня довольно хорошо:
источник