Zip много файлов в несколько архивов

12

Под управлением Linux. У меня есть каталог около 150 больших файлов CSV; простое выполнение с zip -9ними приводит к монолитному файлу, который все еще слишком велик. Я хотел бы просто сжать их в возможно четыре или пять почтовых файлов 30-40 CSV каждый; таким образом, порядок последовательности или составного почтового индекса не будет проблемой, поскольку каждый почтовый индекс независим. Там должен быть простой способ сделать это. Какие-либо предложения?

(и да, zip является предпочтительным форматом, если это возможно)

WorldsEndless
источник

Ответы:

22

Не достаточно ли переключателя? Вы можете использовать zip -s, чтобы разбить файл на файлы максимального размера, например:

"zip -s 300m <файл 2 ГБ>" производит:

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)

Тогда "unzip file.zip" разархивирует все вместе.

ranisalt
источник
Какая версия Zip это ?? Я получаю file.z01 file.z02 ... file.zip и unzip file.zipне работает напрямую (я бы использовал zip -F для их рекомбинации первым). Обратите внимание, что они не являются «независимыми» в соответствии с запросом.
sourcejedi
1
@sourcejedi: В этом ответе ( superuser.com/a/602736/195224 ) приведены некоторые более подробные объяснения.
mpy
@ Я знаю, я только что написал этот ответ :).
sourcejedi
@sourcejedi: О да, теперь ты это говоришь ...;)
mpy
2

Используйте split в списке входных файлов :-).

(Не проверено, я включил команды rm для очистки, позаботьтесь).

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
источник
Почему вы используете split -C( --line-bytes), а не split -l( --lines)? Это было бы более предсказуемо, учитывая, сколько CSV-файлов находится в одном архиве.
День
Я просмотрел справочную страницу слишком быстро. Спасибо, я все исправлю!
sourcejedi