Spakuj wiele plików do kilku archiwów

13

Z systemem Linux. Mam katalog około 150 dużych plików CSV; samo zip -9ich wykonanie powoduje, że plik monolityczny jest nadal zbyt duży. Chciałbym, aby po prostu spakował je w może w czterech lub pięciu plikach zip po 30-40 CSV każdy; w ten sposób sekwencjonowanie lub kolejność łączenia zip nie będzie problemem, ponieważ każdy zip jest niezależny. Musi istnieć prosty sposób, aby to zrobić. Jakieś sugestie?

(i tak, zip jest preferowanym formatem, jeśli to możliwe)

WorldsEndless
źródło

Odpowiedzi:

23

Czy przełącznik -s nie wystarczy? Możesz użyć zip -s, aby podzielić plik na pliki o maksymalnym rozmiarze, np .:

„zip -s 300m <plik 2 GB>” powoduje:

file.zip (300 mb, master file)
file.001.zip (300 mb)
file.002.zip (300 mb)
file.003.zip (300 mb)
file.004.zip (300 mb)
file.005.zip (300 mb)
file.006.zip (200 mb)

Następnie „rozpakuj plik.zip” rozpakuje wszystko razem.

ranisalt
źródło
Jaka to wersja zip? Dostaję file.z01 file.z02 ... file.zip i unzip file.zipnie działa bezpośrednio (użyłbym zip -F, aby je ponownie połączyć ). Zauważ, że nie są one „niezależne”, zgodnie z żądaniem.
sourcejedi
1
@sourcejedi: W tej odpowiedzi ( superuser.com/a/602736/195224 ) znajduje się kilka bardziej szczegółowych wyjaśnień.
mpy
@ mpy Wiem, właśnie napisałem tę odpowiedź :).
sourcejedi
@sourcejedi: O tak, teraz to mówisz ...;)
mpy
2

Użyj split na liście plików wejściowych :-).

(Nie testowałem, dołączyłem polecenia rm do czyszczenia, uważaj).

ls *.csv > csvfiles
split -d -l30 - csvfiles < csvfiles
for i in csvfiles[0-9][0-9]; do
  zip "$i.zip" -@ < "$i"
done

rm csvfiles
rm csvfiles[0-9][0-9]
sourcejedi
źródło
Dlaczego używasz split -C( --line-bytes), a nie split -l( --lines)? Byłoby to bardziej przewidywalne, biorąc pod uwagę liczbę plików CSV w jednym archiwum.
mpy
Zbyt szybko przejrzałem stronę. Dzięki, naprawię to!
sourcejedi