【问题标题】:how to split a file with nbytes and using head and tail如何用 nbytes 分割文件并使用 head 和 tail
【发布时间】:2019-12-10 17:09:43
【问题描述】:

我正在尝试制作一个将文件拆分为 nbytes 的脚本。 我已经注意到这一点,但我想使用 head 和 tail 而不是像我一样使用 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

【问题讨论】:

  • split -d -b "$2" "$1" "$1"?
  • 是 2 个参数,一个用于字节,另一个用于文件名。最后一个是重命名不同的文件

标签: linux bash tail head wc


【解决方案1】:

您可以使用bash(+head,+tail)实现轻量级拆分版本。但是,它不会很有效,因为您需要读取文件时间,其中 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”,它对大文件有更强大的逻辑。

【讨论】:

  • 感谢您的拆分实现,我正在寻找。我正在尝试理解您的代码,但我知道拆分效率不高
  • @YoloSama 你用什么外壳? bash 有 printf,错误信息是什么?我已经修改了脚本以避免 printf。
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 2022-11-06
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多