[英]how to split a file with nbytes and using head and tail
我正在尝试制作一个脚本,将文件分割为 nbytes。 我已经注意到这一点,但我想使用头部和尾部,而不是像我一样使用 split。
#!/bin/sh
if [ $# -eq 0 ];then
exit 1
fi
if [ $# -eq 1 ];then
exit 1
fi
if [ $2 -eq 0 ];then
exit 1
fi
if [ ! -f "$1" ];then
exit 1
fi
split -d -b 1024 bigfile.bin bigfile.bin.
它给出了这个:
-rw-rw-r-- 1 madushan madushan 1024 déc. 10 17:34 bigfile.bin.00
-rw-rw-r-- 1 madushan madushan 1024 déc. 10 17:34 bigfile.bin.01
-rw-rw-r-- 1 madushan madushan 1024 déc. 10 17:34 bigfile.bin.02
-rw-rw-r-- 1 madushan madushan 1024 déc. 10 17:34 bigfile.bin.03
-rw-rw-r-- 1 madushan madushan 1024 déc. 10 17:34 bigfile.bin.04
-rw-rw-r-- 1 madushan madushan 1024 déc. 10 17:34 bigfile.bin.05
-rw-rw-r-- 1 madushan madushan 1024 déc. 10 17:34 bigfile.bin.06
-rw-rw-r-- 1 madushan madushan 1024 déc. 10 17:34 bigfile.bin.07
-rw-rw-r-- 1 madushan madushan 1024 déc. 10 17:34 bigfile.bin.08
-rw-rw-r-- 1 madushan madushan 784 déc. 10 17:34 bigfile.bin.09
您可以使用bash
(+head, +tail) 实现一个轻量级的 split 版本。 但是,它的效率不会很高,因为您需要读取文件时间,其中 N=totalsize/nbytes。 对于小文件,开销很小,对于大文件,非常昂贵。
nbytes=1024
file=bigfile.bin
k=0
i=0
while tail --bytes=+$((nbytes*i)) < $file | head --bytes=$nbytes > $file.work ; do
# Stop unless segment has data
[ -s "$file.work" ] || break
let i++
echo "Segment: $i"
mv "$file.work" "$file.$i"
done
rm -f $file.work
如果仅使用 head 就可以,则可能对大文件更有效。 它只会读取输入一次,无需重新读取任何内容。
nbytes=1024
file=bigfile.bin
k=0
i=0
(
while head --bytes=$nbytes > $file.work ; do
[ -s "$file.work" ] || break
let ++i
mv "$file.work" "$file.$i"
done
) < $file
rm -f $file.work
还可以考虑使用“dd”,它对大文件具有更强大的逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.