Linux 中是否有任何工具可以就地分割文件?

Linux 中是否有任何工具可以就地分割文件?

我有一个 500G 的文件,想在 Linux 中拆分,但是我没有另外 500G 可用来运行split(1)

是否有一个工具或脚本可以将文件就地分割成 1G 块,同时占用最少的额外空间?

答案1

#!/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

我发现 @whitequark 脚本非常有用。但我想将 500GB 的磁盘映像分割成几个大约 50GB 的大块。这样,脚本就失败了,因为dd无法处理这么大的bs参数。

因此我定制了脚本,以bs=1M兆字节而不是字节为单位进行创建和请求。现在我可以就地拆分成非常大的块,例如5000050GB。

/bin/bash #!/bin/bash
© whitequark 2010
#(c)dertalai 2015(最小修改)

设置-e

如果 [ $# != 2 ]; 那么
  echo "使用量:$0"
  echo“此脚本将文件拆分为多个部分,从”开始
  echo "结束,并且正在截断原始文件。"
  echo " 部分大小以兆字节为单位指定(1 MB = 1048576 字节)。"
  echo“使用风险由您自行承担。”
  出口 0

文件名=$1
#零件尺寸=$2
部分大小MB=$2
零件尺寸=$(($2 * 1048576))

大小=$(stat -c'%s'“${filename}”)
零件=$(($size/$零件尺寸))

do_split(){
  _部分=$1
  _尺寸=$2

  echo "拆分部分 $_part"
  回显 $(($partsize * ($_part - 1)))
  dd if="${filename}" of="${filename}.$(printf '%04d' $_part)" \
      计数=$partsizeMB bs=1M 跳过=$((($_part - 1) * $partsizeMB))
  echo "截断源文件"
  截断“${filename}”--size="-$_size"
}

最后大小=$(($size % $partsize))
如果 [ $lastsize != 0 ]; 那么
  do_split $(($parts + 1)) $lastsize

对于 $(seq $parts -1 1) 中的 i;执行
  do_split $i $partsize
完毕

rm "${文件名}"

答案3

你真的有 500GB 的文件了吗?如果你通过存档文件夹或磁盘生成 500GB 的文件,然后尝试拆分它,则可以通过将 tar(或你正在使用的任何程序)的输出导入 split 来即时拆分它:

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

这将对我的 Time Machine 数据库的存档进行 DVD 大小的分割。但是,它会一次性分割所有文件,这意味着它实际上并没有达到你想要的效果。

查看我的问题这里了解更多信息。Whitequark 的脚本经过一些轻微修改后可能会有用!我得试试。

相关内容