Czy mogę sprawić, aby rozpakowanie lub podobne programy działały na standardowym wyjściu? Sytuacja polega na tym, że pobieram plik zip, który powinien być rozpakowany w locie.
Powiązany problem: Jak potokować pobrany plik do standardowego wyjścia w bash?
linux
ubuntu
pipe
compression
Alex
źródło
źródło
Odpowiedzi:
Chociaż plik zip jest w rzeczywistości formatem kontenera, nie ma powodu, dla którego nie można go odczytać z potoku (standardowego wejścia), jeśli plik można łatwo dopasować do pamięci. Oto skrypt w języku Python, który pobiera plik zip jako standardowe wejście i wypakowuje zawartość do bieżącego katalogu lub do określonego katalogu, jeśli jest określony.
Skrypt ten można zminimalizować do jednej linii i utworzyć jako alias.
Teraz łatwo rozpakuj wyjście wget.
źródło
.read()
metodyJest mało prawdopodobne, aby działało zgodnie z oczekiwaniami. Zip to nie tylko format kompresji, ale także format kontenera. Łączy zadania zarówno tar, jak i gzip.bzip2 w jednym. Powiedziawszy to, jeśli twój zip ma jeden plik, możesz użyć rozpakowania -p, aby wyodrębnić pliki na standardowe wyjście. Jeśli masz więcej niż jeden plik, nie ma sposobu, aby powiedzieć, gdzie zaczynają się i kończą.
Jeśli chodzi o czytanie ze stdin, strona podręcznika rozpakowania ma następujące zdanie:
Możesz mieć trochę szczęścia z funzip.
źródło
To, co chcesz zrobić, to
unzip
wziąć plik ZIP na standardowe wejście zamiast argumentu. Zazwyczaj jest to łatwo wspierane przezgzip
itar
rodzaj narzędzi z-
argumentem. Ale standardunzip
tego nie robi (obsługuje jednak ekstrakcję do potoku). Jednak nie wszystko jest stracone...Spójrz na stronę podręcznika funzip .
Jest to zgodne z ideą, że większość archiwów linuksowych jest zwykle TAR'owana, a następnie w jakiś sposób skompresowana (gzip, bzip, i in.). To zadziała, jeśli masz
tar.ZIP
.Warto zauważyć, że
funzip
został napisany przez oryginalnego autora Info-ZIP, Marka Adlera. Pisze na stronie man funzip,jednak nie ma takiej aktualizacji. Podejrzewam, że Mark uznał to za niepotrzebne, ponieważ inne metody archiwizacji działały łatwo z TAR.
źródło
Lubię używać curl, ponieważ jest on instalowany domyślnie (
-L
jest potrzebny do często przekierowywanych):Jednak
bsdtar
nie jest instalowany domyślnie i nie mogłem zabrać sięfunzip
do pracy.źródło
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
Nie jest to możliwe w przypadku Info-Zip, który jest najczęstszą implementacją OSS. Co ważniejsze, nie jest to zalecane ze względu na konstrukcje archiwów ZIP.
Jeśli zmiana formatu jest dla Ciebie wykonalna, rozważ użycie tar (1). Jest całkiem zadowolony z przesyłanych strumieniowo danych wejściowych / wyjściowych i faktycznie oczekuje tego domyślnie.
Ponadto często można stwierdzić, czy aplikacje oczekują przesyłanych strumieniowo danych wejściowych / wyjściowych, określając „-” dla nazwy pliku. Info-Zip, jak można sobie wyobrazić, nie traktuje tego jako ważnego argumentu.
źródło
W Zsh możesz wykonać następujące czynności:
źródło
Najprostszym dostępnym narzędziem, które to zrobi, jest to
jar
, że zakłada się, że STDIN jest używany, jeśli przekaże się go bez argumentów pliku. Pobiera również argumenty podobne dotar
programu dla operacji.np. wypisuje zawartość archiwum
curl https://my.example.com/file.zip | jar t
Chociaż Java nie zawsze jest instalowana, na tych komputerach, na których się ona znajduje,
jar
jest zdecydowanie najwygodniejszą metodą.ź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
Potrzebowałem czegoś bardziej złożonego - wyodrębnij konkretny plik, jeśli istnieje. Trudność polega na tym, że strumień pliku wejściowego może nie być plikiem zip, w którym to przypadku musiałem go kontynuować przez potok. Oto moje rozwiązanie (głównie dzięki rozwiązaniu Jasona R. Coombsa)
Zapisałem to jako plik o nazwie „effpoptp” (nie jest to prosta nazwa) w folderze „/ bin” na moim komputerze, więc testowanie wygląda tak:
Celem jest kontrola wersji plików MySQL Workbench, gdzie może to być plik xml o nazwie jako plik workbench lub pełny plik workbench.
źródło