Как я объясняю в этом вопросе о SuperUser, вы можете добиться этого, используя технику, изложенную Томом Зичем в его комментарии.
bigfile="mybigfile-100Mb"
chunkprefix="chunk_"
# Chunk offsets
OneMegabyte=1048576
chunkoffsets=(0 $((OneMegabyte*20)) $((OneMegabyte*60)) $((OneMegabyte*70)))
currentchunk=$((${#chunkoffsets[@]}-1))
while [ $currentchunk -ge 0 ]; do
# Print current chunk number, so we know it is still running.
echo -n "$currentchunk "
offset=${chunkoffsets[$currentchunk]}
# Copy end of $archive to new file
tail -c +$((offset+1)) "$bigfile" > "$chunkprefix$currentchunk"
# Chop end of $archive
truncate -s $offset "$archive"
currentchunk=$((currentchunk-1))
done
Вам нужно дать сценарию начальную позицию (смещение в байтах, ноль означает чанк, начиная с первого байта bigfile
) каждого чанка, в порядке возрастания, как в пятой строке.
Если необходимо, автоматизируйте его, используя seq: Следующая команда выдаст chunkoffsets с одним чанком в 0, затем одним, начиная с 100k, а затем по одному на каждый мегабайт для диапазона 1-10 Мб (обратите внимание на -1 для last
параметр, поэтому он исключается) затем один блок каждые два мегабайта для диапазона 10–20 МБ.
OneKilobyte=1024
OneMegabyte=$((1024*OneKilobyte))
chunkoffsets=(0 $((100*OneKilobyte)) $(seq $OneMegabyte $OneMegabyte $((10*OneMegabyte-1))) $(seq $((10*OneMegabyte-1)) $((2*OneMegabyte)) $((20*OneMegabyte-1))))
Чтобы увидеть, какие чанки вы установили:
for offset in "${chunkoffsets[@]}"; do echo "$offset"; done
0
102400
1048576
2097152
3145728
4194304
5242880
6291456
7340032
8388608
9437184
10485759
12582911
14680063
16777215
18874367
20971519
У этой техники есть недостаток, заключающийся в том, что для нее требуется размер как минимум самого большого доступного чанка (хотя вы можете уменьшить его, создав меньшие чанки и конкатенируя их где-нибудь еще). Кроме того, он будет копировать все данные, так что это далеко не мгновенно.
Что касается того, что некоторым аппаратным видеорегистраторам (PVR) удается разделить видео в течение нескольких секунд, они, вероятно, хранят только список смещений для каждого видео (также известные как главы) и отображают их как независимые видео в своем пользовательском интерфейсе.