tar, gz, zip 또는 bzip2를 사용하여 파일 분할 [닫힘]


144

약 17-20GB의 큰 파일을 압축해야합니다. 파일 당 약 1GB의 여러 파일로 분할해야합니다.

Google을 통해 솔루션을 검색하고 splitcat명령을 사용하는 방법을 찾았습니다 . 그러나 그들은 큰 파일에는 전혀 작동하지 않았습니다. 또한 Windows에서는 작동하지 않습니다. Windows 컴퓨터에서 추출해야합니다.


3
나는 당신의 고통을 느낍니다. 그러나 이것은 프로그래밍과 관련이없는 것 같습니다.
Jason S

1
7-Zip과 같은 많은 압축 프로그램은 압축 파일을 지정된 크기의 볼륨으로 분할하여보다 쉽게 ​​배포 할 수 있습니다.
Martin Liversage

이것은 superuser.com에 속하지만 비공개 베타는 내일까지 시작되지 않습니다.
JesperE

왜 파일을 압축해야하는지 물어봐도 될까요?
Jan Jungnickel

여기에 게시 된 두 가지 실행 가능한 솔루션 중 하나가 전개되지 않으면 프로그래밍 솔루션이 필요합니다.
Joshua

답변:


253

split다음 -b옵션 과 함께 명령을 사용할 수 있습니다 .

split -b 1024m file.tar.gz

@ Joshua 의 답변을 사용하여 Windows 컴퓨터에서 다시 어셈블 할 수 있습니다 .

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

Windows의 경우 동일한 명령의 이식 된 버전을 다운로드하거나 cygwin을 사용할 수 있습니다.


7
파일 이름 뒤에 마지막 인수로 접두사를 추가하지 않으면 xaa, xab, xac, xad ...라는 파일로 출력됩니다.
Charlie

@Charlie, 고마워, 나는 대답을 업데이트했다.
matpie

2
실제로 사용 -b 1024MiB하면 유효하지 않은 바이트 수라는 오류가 발생했습니다. --bytes=1024m작품 사용하기 .
Brian

cat파일을 다시 어셈블 할 필요가 없습니다 . copy /b file1 + file2 + etc..Windows에서 사용할 수 있으며 Linux로 다시 복사하면 tar는 재 조립 된 tarball을 읽을 수 있습니다. 방금 시도했습니다.
Brian

1
분할 옵션 --numeric-suffixes은 알파벳 대신 숫자 접미사를 사용합니다.
Dr. Jan-Philip Gehrcke 12

27

Linux에서 분리하는 경우에도 Windows에서 다시 어셈블 할 수 있습니다.

copy /b file1 + file2 + file3 + file4 filetogether

당신은 또한 사용할 수 있습니다 copy /b file* filetogether- support.microsoft.com/kb/71161
EUG

5
NTFS에서만 제대로 작동하며 파일이 NTFS 정렬 순서로되어있는 경우에만 가능합니다. FAT 또는 FAT32 = 붐에서 사용해보십시오.
Joshua

+1 파일이 올바른 순서인지 확인하십시오!
Brian

@Joshua 공정하게 말해서, 그들이 그렇지 않다면, 당신은 불충분 한 직업 명명을 해왔습니다.
jpmc26

@ jpmc26 : FAT32의 잘못된 디렉토리 순서 변경 습관에 대해 알고 있습니까?
여호수아


8

테스트 된 코드는 처음에 하나의 아카이브 파일을 만든 다음 분할합니다.

 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 바이트입니다.


1
그것은 split이미 무엇입니까 .
ephemient

1
대박 이봐, 난 그냥 찾고있는 게시물을 발굴했습니다. 특정 장치에서 split 또는 zip 명령 / 이진 파일이 없으며이 장치가 완벽하게 작동했습니다. split 명령으로 작동하도록이 코드를 준비하겠습니다 :). @Adrian Panasiuk에게 감사합니다. 그것은 나에게 적합하다.
m3nda

@ erm3nda 천만에요, 기뻐요!
Adrian Panasiuk

그러나 테스트 한 결과 결과는 분할되지 않은 전체 파일이었습니다. 어떻게 할 수 있습니까? 작은 장치에서 큰 파일이어서 프로세스가 길었습니다. 게시하는 동안 솔루션을 테스트하십시오 :(
m3nda

@ erm3nda 당신은 임시 파일을 만드는 것을 피해야한다고 우리에게 말하지 않았다! 두 번째 변형을 참조하십시오!
Adrian Panasiuk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.