Muszę pobrać plik z tego linku . Pobrany plik to plik zip, który będę musiał rozpakować w bieżącym folderze.
Zwykle najpierw pobrałbym go, a następnie uruchomił polecenie unzip.
$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
$ unzip temp.zip
Ale w ten sposób muszę wykonać dwa polecenia, poczekać na zakończenie pierwszego, aby wykonać następne, a także muszę znać nazwę pliku, temp.zip
aby go przekazać unzip
.
Czy można przekierować wyjście wget
do unzip
? Coś jak
$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834`
Ale to nie zadziałało.
bash
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
:: niejednoznaczne przekierowanie
Ponadto wget
wykonano dwukrotnie i dwukrotnie pobrałem plik.
command-line
io-redirection
Andrew-Dufresne
źródło
źródło
Odpowiedzi:
Musisz pobrać pliki do pliku tymczasowego, ponieważ (cytując stronę podręczną rozpakowania):
Po prostu połącz polecenia:
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip; unzip temp.zip; rm temp.zip
Ale aby uczynić go bardziej elastycznym, powinieneś prawdopodobnie umieścić go w skrypcie, aby zaoszczędzić trochę pisania i aby uniknąć przypadkowego nadpisania czegoś, możesz użyć
mktemp
polecenia do utworzenia bezpiecznej nazwy pliku tymczasowego:źródło
wget file.zip && unzip file.zip
to samowget file.zip; unzip file.zip
lub jedno jest preferowane nad drugim? Dzięki :)wget && unzip
uruchomi rozpakowanie tylko wtedy, gdy wget się powiedzie.wget ; unzip
i tak uruchomi rozpakowanie, prawdopodobnie wskazując na nieistniejący plik.Oto odpowiedź mojej odpowiedzi na podobne pytanie:
Format pliku ZIP zawiera katalog (indeks) na końcu archiwum. Ten katalog mówi, gdzie w archiwum znajduje się każdy plik, a zatem umożliwia szybki, losowy dostęp, bez odczytywania całego archiwum.
Wydaje się, że stanowi to problem przy próbie odczytania archiwum ZIP przez potok, ponieważ indeks nie jest dostępny do samego końca, a zatem poszczególne elementy nie mogą zostać poprawnie wyodrębnione, dopóki plik nie zostanie całkowicie odczytany i nie będzie już dostępny . Nic dziwnego, że większość dekompresorów ZIP po prostu zawodzi, gdy archiwum jest dostarczane przez potok.
Katalog na końcu archiwum nie jest jedynym miejscem, w którym meta informacje o pliku są przechowywane w archiwum. Ponadto poszczególne wpisy zawierają również te informacje w lokalnym nagłówku pliku w celu zapewnienia nadmiarowości.
Chociaż nie każdy dekompresor ZIP będzie używał lokalnych nagłówków plików, gdy indeks jest niedostępny, interfejsy tar i cpio do libarchive (aka bsdtar i bsdcpio) mogą i będą to robić podczas czytania przez potok, co oznacza, że możliwe są:
źródło
.zip
-file zawierający pliki z uprawnieniami do wykonywania. Kiedy pobieram i wprowadzam do grybsdtar
, bity exec są wyrzucane. Kiedy pobieram na dysk i rozpakowuję za pomocąbsdtar
lubunzip
wtedy, bity exec są honorowane.bsdtar
otworzy, jest widoczny, czy nie, używa jednego lub drugiego miejsca.Jeśli masz zainstalowany JDK, możesz użyć
jar
:źródło
jar
nie zachowuje uprawnień do plików. W przeciwnym razie fajna sztuczka.| jar xv
Nie sądzę, żebyś nawet chciał zawracać głowę przesyłaniem wyjścia wgeta do rozpakowania.
Z artykułu w Wikipedii „ZIP (format pliku)” :
wget musi całkowicie zakończyć pobieranie, zanim rozpakowanie będzie w stanie wykonać jakąkolwiek pracę, więc działają one sekwencyjnie, bez przeplatania się, jak mogłoby się wydawać.
źródło
Prawidłowa składnia to:
ale to nie zadziała z powodu błędu ( Info-ZIP w Debianie ):
lub w BSD / OS X:
Wynika to z faktu, że standardowe narzędzia zip używają głównie
lseek
funkcji w celu ustawienia przesunięcia pliku na końcu w celu odczytania końca rekordu centralnego katalogu . Znajduje się na końcu struktury archiwum i konieczne jest odczytanie listy plików (patrz: Struktura formatu pliku zip ). Dlatego plik nie może być FIFO, potokiem, urządzeniem końcowym ani żadną inną dynamiką, ponieważ funkcja nie może pozycjonować obiektu wejściowegolseek
.Masz więc następujące obejścia:
tar.gz
),źródło
Repost mojej odpowiedzi :
BusyBox
unzip
może zająć standardowe wejście i wyodrębnić wszystkie pliki.Myślnikiem po
unzip
jest użycie stdin jako danych wejściowych.Możesz nawet,
Ale to po prostu zbędne
unzip file.zip
.Jeśli twoja dystrybucja domyślnie korzysta z BusyBox (np. Alpine), po prostu uruchom
unzip -
.źródło
Działa to dla mnie całkiem dobrze:
źródło