簡體   English   中英

如何使用 nbytes 並使用 head 和 tail 拆分文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM