리눅스에서 파일을 분리하는 도구가 있습니까?


16

리눅스에서 분할하고 싶은 500G 파일이 있지만, 다른 500G를 무료로 사용할 수는 없습니다 split(1).

최소한의 추가 공간을 사용하면서 파일을 1G 청크로 분할하는 도구 또는 스크립트가 있습니까?

답변:


13
#!/bin/bash
# (c) whitequark 2010

set -e

if [ $# != 2 ]; then
  echo "Usage: $0 <filename> <part size>"
  echo "  This script will split file to multiple parts, starting from"
  echo "  the end, and truncating the original file in process."
  echo "  Part size is specified in bytes."
  echo "  Use at your own risk."
  exit 0
fi

filename=$1
partsize=$2

size=$(stat -c '%s' "${filename}")
parts=$(($size / $partsize))

do_split() {
  _part=$1
  _size=$2

  echo "Splitting part $_part"
  echo $(($partsize * ($_part - 1)))
  dd if="${filename}" of="${filename}.$(printf '%04d' $_part)" \
      count=1 bs=$partsize skip=$(($_part - 1))
  echo "Truncating source file"
  truncate "${filename}" --size="-$_size"
}

lastsize=$(($size % $partsize))
if [ $lastsize != 0 ]; then
  do_split $(($parts + 1)) $lastsize
fi

for i in $(seq $parts -1 1); do
  do_split $i $partsize
done

rm "${filename}"

gedit는 분해 후 다시 조립 한 후 성공적으로 실행되었습니다.


2
어떤 이유로 절단이없는 경우 'dd if = / dev / null of = "$ {filename}"seek = 1 bs = $ (($ size-$ _size))'을 사용할 수 있습니다.
ngoozeff

1
감사합니다, 스크립트는 훌륭하게 작동합니다! 문제가 발생하면 파일을 삭제하고 싶지 않습니다. 마지막 줄은 다음과 같습니다.if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
Oleg Mikheev

또한 그것은이 스크립트는 (두 조각으로 500기가바이트을 위반하는 경우 당신이 2백50기가바이트 필요합니다) 부품 크기와 같은 추가 공간이 필요 않는다는 것을 언급 할 필요가
올렉 Mikheev를

1073741824010GB와 같은 값을 전달하면 2GB 파일이 잘못 생성되었다고 덧붙입니다. 300GB 파일을 분할하고 30GB의 여유 공간이있었습니다.
Xavier Leprêtre

3

@whitequark 스크립트가 정말 유용하다는 것을 알았습니다. 그러나 500GB 디스크 이미지를 각각 약 50GB의 큰 덩어리로 나누고 싶었습니다. 이런 식으로 스크립트가 실패했습니다 . ddbs매개 변수를 처리 할 수 ​​없기 때문 입니다.

그래서 bs=1M바이트 대신 메가 바이트 를 만들고 요청 하도록 스크립트를 사용자 정의했습니다 . 이제 예를 들어 5000050GB 를 사용하여 제자리에서 실제로 큰 덩어리로 나눌 수 있습니다 .

#! / bin / bash
# (c) 화이트 쿼크 2010
# (c) dertalai 2015 (최소 수정)

세트 -e

[$ #! = 2]이면; 그때
  echo "사용법 : $ 0"
  echo "이 스크립트는 처음부터 파일을 여러 부분으로 나눕니다."
  echo "끝으로 진행중인 원본 파일을 자릅니다."
  echo "부품 크기는 메가 바이트 (1MB = 1048576 바이트)로 지정됩니다."
  echo "자신의 책임하에 사용하십시오."
  출구 0
fi

파일 이름 = $ 1
# partsize = $ 2
partsizeMB = $ 2
partsize = $ (($ 2 * 1048576))

size = $ (stat -c '% s' "$ {filename}")
parts = $ (($ size / $ partsize))

do_split () {
  _part = $ 1
  _size = $ 2

  echo "부품 $ _part 나누기"
  에코 $ (($ partsize * ($ _part-1)))
  dd if = "$ {filename}"of = "$ {filename}. $ (printf '% 04d'$ _part)"\
      count = $ partsizeMB bs = 1M skip = $ (((($ _ part-1) * $ partsizeMB))
  echo "소스 파일 잘라 내기"
  "$ {filename}"--size = "-$ _ size"를 자릅니다.
}

lastsize = $ (($ size % $ partsize))
[$ lastsize! = 0]이면; 그때
  do_split $ (($ parts + 1)) $ lastsize
fi

$에서 $ (seq $ parts -1 1); 하다
  do_split $ i $ partsize
끝난

rm "$ {filename}"

1

실제로 500GB 파일이 있습니까? 폴더 또는 디스크를 보관하여 500GB 파일을 생성 한 다음 분할하려고하면 tar (또는 사용중인 모든 항목)의 출력을 분할하여 즉시 분할 할 수 있습니다.

sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
     split -d -b 4480m - Backups.backupdb.tar.bz2.

그러면 내 Time machine 데이터베이스 아카이브의 DVD 크기 분할이 만들어집니다. 그러나 한 번에 모두 만들므로 원하는 것을 실제로 수행하지 않습니다.

자세한 내용은 여기 에서 내 질문을 참조하십시오 . Whitequark의 스크립트는 약간의 수정으로 거기에서 유용 할 수 있습니다! 나는 그것을 시도해야 할 것이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.