linux中是否有用于拆分文件的工具?


16

我有一个500G文件,我想在Linux中拆分,但我没有另外500G免费运行 split(1)

是否有工具或脚本将文件就地分割为1G块,同时使用最少的额外空间?

Answers:


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
Oleg Mikheev

另外需要提到的是,这个脚本确实需要额外的空间,这等于部件大小(如果你将500GB分成两块,你需要250GB)
Oleg Mikheev

当我传递值时,我会添加它 10737418240,即10GB,它错误地创建了2GB文件。我正在拆分一个300GB的文件并且有30GB的免费空间。
Xavier Leprêtre

2

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

所以我定制了制作脚本 bs=1M 并要求兆字节而不是字节。现在,我可以使用,例如,在大块中拆分 50000 50GB。

#!/bin/bash
# (c) whitequark 2010
# (c) dertalai 2015 (minimal modifications)

set -e

if [ $# != 2 ]; then
  echo "Usage: $0  "
  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 megabytes (1 MB = 1048576 bytes)."
  echo "  Use at your own risk."
  exit 0
fi

filename=$1
#partsize=$2
partsizeMB=$2
partsize=$(($2 * 1048576))

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=$partsizeMB bs=1M skip=$((($_part - 1) * $partsizeMB))
  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}"

1

你真的有500GB文件吗?如果您通过归档文件夹或磁盘生成500GB文件,然后尝试将其拆分,则可以通过将tar的输出(或您正在使用的任何内容)传输到split中来实时拆分:

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

这将对我的Time机器数据库的存档进行DVD大小的拆分。但是,它确实让它们同时出现,这意味着它确实无法满足您的需求。

看我的问题 这里 了解更多信息。 Whitequark的脚本可能会在那里稍作修改!我得试试看。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.