Wybacz to najbardziej podstawowe pytanie, ale nie mogłem znaleźć bezpośredniej odpowiedzi ani prostego przykładu na wymianie stosu.
Załóżmy, że mam folder plików, który chciałbym skompresować do jednego pliku zip, który mogę udostępnić moim okropnym przyjaciołom z systemu Windows (w przeciwnym razie po prostu użyję tar
i skończę z tym). To wygląda tak:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg
Zakładając, że zip
zainstalowałem:
sudo apt-get install zip
Rozumiem man zip
, że pozwala mi to na użycie listy plików:
- @ listy plików. Jeśli lista plików jest określona jako - @ [Nie w systemie MacOS], zip pobiera listę plików wejściowych ze standardowego wejścia zamiast z wiersza poleceń. Na przykład,
zip -@ foo
Więc stworzyłem, zip.lst
który wygląda tak:
cat zip.lst
file1.txt
file2.txt
file3.txt
file.jpg
test.jpg
A teraz próbowałem:
zip -@ zip.lst
Ale nie zrobił nic poza utworzeniem pustej linii na konsoli. I mogę dalej naciskać, Entera to po prostu robi więcej pustych linii bez pozornego wykonania polecenia. Po kilku poszukiwaniach zdałem sobie sprawę, że muszę zakończyć wprowadzanie, naciskając Ctrl+D
Ale teraz pojawia się ten błąd:
zip warning: missing end signature--probably not a zip file (did you
zip warning: remember to use binary mode when you transferred it?)
zip warning: (if you are trying to read a damaged archive try -F)
zip error: Zip file structure invalid (zip.lst)
Co!? Dlaczego moja prosta lista nie jest „prawidłową strukturą plików”? Wróć do instrukcji, aby uzyskać więcej informacji, i przyjmuję się bliżej:
Jeśli lista plików jest określona jako - @ ...
Więc próbuję bez -@
, a to przynajmniej przetwarza go od razu, bez konieczności naciskania Ctrl+, Dale mam ten sam błąd .
Na szczęście znalazłem komentarz do odpowiedzi na prawie niezwiązane pytanie, które doprowadziło mnie do zrozumienia, że muszę wyraźnie nazwać plik zip. Wystąpił błąd, ponieważ domyślnie próbował utworzyć plik zip o nazwie zip.lst
. Ale ponieważ taka jest nazwa mojej listy, można by pomyśleć, że po prostu ją zastąpi, ale nie, w rzeczywistości próbowała ją zaktualizować. A ponieważ lista oczywiście nie jest plikiem zip, otrzymujemy błąd nieprawidłowej struktury pliku, a teraz jest jasne, dlaczego napisano „prawdopodobnie nie plik zip”. Więc próbowałem:
zip files.zip zip.lst
adding: zip.lst (deflated 35%)
Eureka! Widzę, że plik zip został utworzony, a mój folder zawiera teraz:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst
Ale poczekaj, zanim będziemy świętować, najpierw potwierdź zawartość pliku zip:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
48 2016-05-24 15:30 zip.lst
--------- -------
48 1 file
Nie! Właściwie to ma sens ze standardowego użycia, ponieważ po prostu spakowałem jeden plik listy, który mu dałem. W końcu spróbowałem ponownie, -@
ale uzyskałem ten sam wynik.
Co ja robię źle?
BTW, wiem, że mogę korzystać z GUI i robić to za pomocą myszki, ale muszę to napisać, i ogólnie jestem szybszy na CLI, kiedy wiem, co robię.
ls
igrep
i zip-@
, możesz użyć globusów powłoki, aby wybrać pliki bezpośrednio w linii poleceń zip np .zip files.zip file*
Lubzip images.zip *.jpg
. Ponadto, korzystając z listy nazw plików z pliku, można użyć przekierowania zamiast wywoływać osobny proces cat,zip files.zip -@ < zip.lst
find
zamiastls
najprostsze polecenie z maksymalnym poziomem kompresji
źródło