Linuxにファイルを所定の場所に分割するツールはありますか?


16

Linuxで分割したい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
オレグMikheev

また、それは一部のサイズ(あなたが二つに500ギガバイトを破壊している場合は、250ギガバイトが必要です)に等しいれ、このスクリプトは、追加のスペースを必要としないことを言及する必要があります
オレグMikheev

value 10737418240、つまり10GB を渡すと、誤って2GBのファイルが作成されたことを追加します。300GBのファイルを分割し、30GBの空き容量がありました。
ザビエルレプレトレ

3

@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}"

1

実際に500GBのファイルをまだ持っていますか?フォルダーまたはディスクをアーカイブして500 GBのファイルを生成し、それを分割しようとする場合、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.