Збирайте багато файлів у кілька архівів


13

Запуск Linux. У мене каталог з близько 150 великих файлів CSV; просто робити zip -9на них виходить монолітний файл, який все ще занадто великий. Мені б хотілося, щоб вони просто зафіксували їх, можливо, в чотири-п’ять поштових файлів по 30-40 CSV в кожному; таким чином, послідовне чи розтягнуте поштове замовлення не буде проблемою, оскільки кожен поштовий індекс незалежний. Має бути простий спосіб зробити це. Будь-які пропозиції?

(і так, zip - це бажаний формат, якщо це можливо)

Відповіді:


23

Чи недостатньо комутаторів? Ви можете використовувати zip -s, щоб розділити файл на файли максимального розміру, наприклад:

"zip -s 300m <2 gb file>" видає:

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)

Тоді "розпакуйте файл.zip" розпакуйте все разом.


Яка версія zip це ?? Я отримую file.z01 file.z02 ... file.zip і unzip file.zipне працює безпосередньо (я б скористався zip -F, щоб їх рекомбінувати спочатку). Зауважте, що вони не є "незалежними", як вимагається.
sourcejedi

1
@sourcejedi: У цій відповіді ( superuser.com/a/602736/195224 ) є кілька більш детальних пояснень.
mpy

@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]

Чому ви використовуєте split -C( --line-bytes), а не split -l( --lines)? Це було б передбачуваніше щодо кількості файлів CSV в одному архіві.
mpy

Я занадто швидко прокинув сторінку. Спасибі, я це виправлю!
sourcejedi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.