Разделение файлов с использованием tar, gz, zip или bzip2
Мне нужно сжать большой файл размером около 17-20 ГБ. Мне нужно разбить его на несколько файлов размером около 1 ГБ на файл.
Я искал решение через Google и нашел способы использования команд split
и cat
. Но они вообще не работали для больших файлов. Кроме того, они не будут работать в Windows; Мне нужно извлечь его на машину Windows.
Ответы
Ответ 1
Вы можете использовать команду split
с опцией -b
:
split -b 1024m file.tar.gz
Он может быть собран на компьютере под управлением Windows, используя @Joshua.
copy /b file1 + file2 + file3 + file4 filetogether
Изменить. Как указано в комментарии @Charlie в комментарии ниже, вы можете явно установить префикс, потому что он будет использовать x
в противном случае, что может ввести в заблуждение.
split -b 1024m "file.tar.gz" "file.tar.gz.part-"
// Creates files: file.tar.gz.part-aa, file.tar.gz.part-ab, file.tar.gz.part-ac, ...
Изменить: редактирование сообщения, потому что вопрос закрыт, и наиболее эффективное решение очень близко к содержанию этого ответа:
# create archives
$ tar cz my_large_file_1 my_large_file_2 | split -b 1024MiB - myfiles_split.tgz_
# uncompress
$ cat myfiles_split.tgz_* | tar xz
Это решение позволяет избежать необходимости использования промежуточного большого файла при сжатии (де). Используйте параметр tar -C, чтобы использовать другой каталог для результирующих файлов. btw, если архив состоит только из одного файла, tar можно было бы избежать и использовать только gzip:
# create archives
$ gzip -c my_large_file | split -b 1024MiB - myfile_split.gz_
# uncompress
$ cat myfile_split.gz_* | gunzip -c > my_large_file
Для окон вы можете загрузить портированные версии тех же команд или использовать cygwin.
Ответ 2
Если вы раскалываетесь из Linux, вы все равно можете собраться в Windows.
copy /b file1 + file2 + file3 + file4 filetogether
Ответ 3
используйте tar для разделить на несколько архивов
существует множество программ, которые будут работать с файлами tar в окнах, включая cygwin.
Ответ 4
Протестированный код, изначально создающий один файл архива, затем разбивает его:
gzip -c file.orig > file.gz
CHUNKSIZE=1073741824
PARTCNT=$[$(stat -c%s file.gz) / $CHUNKSIZE]
# the remainder is taken care of, for example for
# 1 GiB + 1 bytes PARTCNT is 1 and seq 0 $PARTCNT covers
# all of file
for n in `seq 0 $PARTCNT`
do
dd if=file.gz of=part.$n bs=$CHUNKSIZE skip=$n count=1
done
Этот вариант опускает создание одного архивного файла и прямо идет на создание частей:
gzip -c file.orig |
( CHUNKSIZE=1073741824;
i=0;
while true; do
i=$[i+1];
head -c "$CHUNKSIZE" > "part.$i";
[ "$CHUNKSIZE" -eq $(stat -c%s "part.$i") ] || break;
done; )
В этом варианте, если размер архивного файла делится на $CHUNKSIZE
, тогда последний частичный файл будет иметь размер файла 0 байтов.