답변:
#!/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
10737418240
10GB와 같은 값을 전달하면 2GB 파일이 잘못 생성되었다고 덧붙입니다. 300GB 파일을 분할하고 30GB의 여유 공간이있었습니다.
@whitequark 스크립트가 정말 유용하다는 것을 알았습니다. 그러나 500GB 디스크 이미지를 각각 약 50GB의 큰 덩어리로 나누고 싶었습니다. 이런 식으로 스크립트가 실패했습니다 . dd
큰 bs
매개 변수를 처리 할 수 없기 때문 입니다.
그래서 bs=1M
바이트 대신 메가 바이트 를 만들고 요청 하도록 스크립트를 사용자 정의했습니다 . 이제 예를 들어 50000
50GB 를 사용하여 제자리에서 실제로 큰 덩어리로 나눌 수 있습니다 .
#! / 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의 스크립트는 약간의 수정으로 거기에서 유용 할 수 있습니다! 나는 그것을 시도해야 할 것이다.