zip: Zbyt długa lista argumentów (ogółem 80 000 plików)

14

Muszę skompresować 80 000 plików do wielu plików zip. Oto polecenie, którego używam:

zip -s 200M photos_test/*

Jednak pojawia się następujący błąd:

-bash: /usr/bin/zip: Argument list too long

Co mogę zrobić, aby rozwiązać problem, oprócz ręcznego dzielenia plików folderów?

dzięki

aneuryzm
źródło
Błąd -bash: /usr/bin/zip: Argument list too longmoże powodować przypadek: 1 - z powodu nieużywania -rprzełącznika, 2 - jest zbyt wiele plików do archiwizacji. Tak więc w pierwszym przypadku odpowiedź @ Mat jest prawdziwa, aw drugim przypadku odpowiedź @ IgnacioVazquez-Abrams jest prawdziwa.
shgnInc

Odpowiedzi:

14

Jeśli chcesz cały katalog, możesz po prostu użyć -rprzełącznika:

zip -r -s 200M myzip photos_test

Obejmuje to wszystkie podkatalogi photos_testchociaż.

Mata
źródło
Zrobiłem to, co sugerujesz, i mam mały plik myzip.zip (7 MB) i segmenty (200 MB każdy). Jednak nie mogę rozpakować zawartości, uruchamiam unzip unix myzip.zip, ale dostaję „złe przesunięcie pliku zip (lseek)”. Ponadto muszę je rozpakować również w środowisku Windows, a tam mam chyba tylko ekstraktor Windows 7.
aneuryzm
to są różne pytania, otwórz na to kolejne pytanie (link do tego w celach informacyjnych). upewnij się, że publikujesz nazwy wygenerowanych plików zip (nie wszystkie, ale przynajmniej pierwsze i ostatnie) oraz dokładną linię poleceń, której używasz.
Mat.
9

Problemem wydaje się być rozszerzenie „*”. Użyj nazwy folderu lub „.”:

Jeśli chcesz uwzględnić folder główny w zipie:

zip -r my.zip folder_with_80k_files

Jeśli nie chcesz dołączać folderu głównego do pliku zip:

cd folder_with_80k_files
zip -r my.zip .
stoffen
źródło
5
find photos_test/ -mindepth 1 -maxdepth 1 | zip -@ -s 200M
Ignacio Vazquez-Abrams
źródło
3
Użyj, find . -mindepth 1 -maxdepth -name '*.json' | zip {YOURZIPFILENAME}.zip -@jeśli nie musisz dzielić i chcesz wybierać pliki według rozszerzenia.
Daniel Sokolowski,
3

ls photos_test | zip -s 200M -@ photos

  • -@spowoduje, że zip przeczyta listę plików ze standardowego wejścia
  • |Rura zostanie przetworzone wyjście z lsna wejściu z zippoleceniem

man zip:

USE
⋮
   -@ file lists.  If a file list is specified as -@ [Not on MacOS], zip takes
   the  list  of  input  files from standard input instead of from the command
   line.  For example,

          zip -@ foo

   will store the files listed one per line on stdin in foo.zip.

   Under Unix, this option can be used to powerful effect in conjunction  with
   the  find (1)  command.   For example, to archive all the C source files in
   the current directory and its subdirectories:

          find . -name "*.[ch]" -print | zip source -@

   (note that the pattern must be quoted to keep the shell from expanding it).
⋮
Pan Tao
źródło