我有一个 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
兆字节而不是字节为单位进行创建和请求。现在我可以就地拆分成非常大的块,例如50000
50GB。
/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 的脚本经过一些轻微修改后可能会有用!我得试试。