我的 Linux 机器上有一个巨大的文件。该文件约为 20GB,我的盒子上的空间约为 25GB。我想将文件分成约 100mb 的部分。我知道有一个“分割”命令,但它保留了原始文件。我没有足够的空间来保存原件。关于如何实现这一点有什么想法吗?我什至会使用任何节点模块,如果它们使任务比 bash 更容易的话。
我的尝试:
#! /bin/bash
if [ $# -gt 2 -o $# -lt 1 -o ! -f "$1" ]; then
echo "Usage: ${0##*/} <filename> [<split size in M>]" >&2
exit 1
fi
bsize=${2:-100}
bucket=$( echo $bsize '* 1024 * 1024' | bc )
size=$( stat -c '%s' "$1" )
chunks=$( echo $size / $bucket | bc )
rest=$( echo $size % $bucket | bc )
[ $rest -ne 0 ] && let chunks++
while [ $chunks -gt 0 ]; do
let chunks--
fn=$( printf '%s_%03d.%s' "${1%.*}" $chunks "${1##*.}" )
skip=$(( bsize * chunks ))
dd if="$1" of="$fn" bs=1M skip=${skip} || exit 1
truncate -c -s ${skip}M "$1" || exit 1
done
上面假设bash(1)
,以及 Linux 实现stat(1)
, dd(1)
, and truncate(1)
。它应该尽可能快,因为它使用dd(1)
复制初始文件的块。它还使用bc(1)
确保 20GB 范围内的算术运算不会溢出任何内容。但是,该脚本仅在较小的文件上进行了测试,因此在针对您的数据运行它之前请仔细检查它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)