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)

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.


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]

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.