답변:
#!/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는 분해 후 다시 조립 한 후 성공적으로 실행되었습니다.
if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
1073741824010GB와 같은 값을 전달하면 2GB 파일이 잘못 생성되었다고 덧붙입니다. 300GB 파일을 분할하고 30GB의 여유 공간이있었습니다.
@whitequark 스크립트가 정말 유용하다는 것을 알았습니다. 그러나 500GB 디스크 이미지를 각각 약 50GB의 큰 덩어리로 나누고 싶었습니다. 이런 식으로 스크립트가 실패했습니다 . dd큰 bs매개 변수를 처리 할 수 없기 때문 입니다.
그래서 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}"
실제로 500GB 파일이 있습니까? 폴더 또는 디스크를 보관하여 500GB 파일을 생성 한 다음 분할하려고하면 tar (또는 사용중인 모든 항목)의 출력을 분할하여 즉시 분할 할 수 있습니다.
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
그러면 내 Time machine 데이터베이스 아카이브의 DVD 크기 분할이 만들어집니다. 그러나 한 번에 모두 만들므로 원하는 것을 실제로 수행하지 않습니다.
자세한 내용은 여기 에서 내 질문을 참조하십시오 . Whitequark의 스크립트는 약간의 수정으로 거기에서 유용 할 수 있습니다! 나는 그것을 시도해야 할 것이다.