如何使用nbytes分割文件并使用head和tail

时间:2019-12-10 17:09:43

标签: linux bash tail head wc

我正在尝试创建一个脚本,用于将文件除以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

1 个答案:

答案 0 :(得分:1)

您可以使用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',它对大型文件具有更强大的逻辑。