回答:
#!/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、バイトではなくメガバイトを作成および要求するようにスクリプトをカスタマイズしました。これで、たとえば5000050GB を使用して、所定の場所に分割し、本当に大きなチャンクに分割できます。
#!/ bin / bash
#(c)ホワイトクォーク2010
#(c)dertalai 2015(最小限の修正)
セット-e
if [$#!= 2]; それから
echo "使用法:$ 0"
echo "このスクリプトは、ファイルを複数の部分に分割します。
echo "終わり、処理中の元のファイルを切り捨てます。"
echo "パーツサイズはメガバイト単位で指定されます(1 MB = 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"
echo $(($ partsize *($ _part-1))))
dd if = "$ {filename}" of = "$ {filename}。$(printf '%04d' $ _part)" \
count = $ partsizeMB bs = 1M skip = $((($ _ part-1)* $ partsizeMB))
echo "ソースファイルの切り捨て"
truncate "$ {filename}" --size = "-$ _ size"
}
lastsize = $(($ size%$ partsize))
if [$ lastsize!= 0]; それから
do_split $(($ parts + 1))$ lastsize
fi
for i in $(seq $ parts -1 1); 行う
do_split $ i $ partsize
やった
rm "$ {filename}"
実際に500GBのファイルをまだ持っていますか?フォルダーまたはディスクをアーカイブして500 GBのファイルを生成し、それを分割しようとする場合、tar(または使用しているもの)の出力を分割してパイプで分割することができます:
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
これにより、Time MachineデータベースのアーカイブのDVDサイズの分割が作成されます。ただし、一度にすべてを実行するため、探しているものが実際に実行されません。
詳細については、こちらの質問をご覧ください。Whitequarkのスクリプトは、若干の変更を加えるとそこに役立つ可能性があります。私はそれを試さなければなりません。