Разделение файлов с использованием 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

Ответ 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 байтов.