LINUX.ORG.RU

Как разбить файл на несколько файлов поменьше?

 


0

3

ЛОР, у меня проблемы с логикой. Хочу разбить файл на несколько более мелких, да не просто разбить, а чтобы размер этих файлов и количество файлов было рандомно. С целью дополнительной конспЫрации тэк сказать. =)

split этого не умеет, пришлось ваять костыль, который вроде работает, но, иногда случается полная херня.

#!/bin/sh

host=`hostname`
date=`date +'%F %T'`

size=42
size=$(($size * 1024 * 1024))
rand=1
while [ $rand -lt $size ]; do
  rand=$(($rand * $RANDOM))
done

while [ $size -gt 0 ]; do
  if [ $size -gt 100500 ]; then
    chunk=$(($rand % $size))
    size=$(($size - $chunk))
  else
    chunk=$size
    size=0
  fi
  digit=$((${digit:-0} + 1))
  echo dd if=/tmp/snapshot.img of="/tmp/$host $date `printf %05d $digit`" bs=$chunk count=1
done

херня заключается в том, что скрипт иной раз уходит в бесконечный цикл

$ sh test.sh 
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00001 bs=14829696 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00002 bs=15278592 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00003 bs=5386752 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00004 bs=368256 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00005 bs=4787328 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00006 bs=1223040 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00007 bs=1083264 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00008 bs=0 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00009 bs=0 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00010 bs=0 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00011 bs=0 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00012 bs=0 count=1
dd if=/tmp/snapshot.img of=/tmp/host 2015-05-28 13:02:28 00013 bs=0 count=1

хотя в упор не вижу где у меня с логикой проблема. помогите?

★★★★★
chunk=$(($rand % $size)); [ $chunk = 0 ] && chunk=$size

иногда chunk выпадает 0 и случается херня. строчка выше фиксит это.

ещё не забыть сделать seek в dd, а ещё хочу добавить рандомный мусор из /dev/urandom в некоторые файлы. конечный вариант скрипта выложу как закончу. =)

Spoofing ★★★★★
() автор топика

split этого не умеет

Щито? split умеет в количество файлов, почему бы просто не зарандомить это количество?

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

размеры файлов хочу разные :)

на самом деле можно было бы сделать split каждого последующего файла, но такой рандом получился бы строго от большего к меньшему, что не ок.

Spoofing ★★★★★
() автор топика
Последнее исправление: Spoofing (всего исправлений: 1)
Ответ на: комментарий от Spoofing

Ну так они и будут разные. Или тебе прям совсем разные нужно (чтоб, скажем, гигабайтный файл бился на два куска по 200 метров и 6 кусков по 100)?

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

ну да, чтобы прям у каждого файла размер был $ echo $RANDOM :)

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

но такой рандом получился бы строго от большего к меньшему

Теоретически - не обязательно. Можно давать сплиту размер, гарантированно бОльший чем половина исходного файла, и потом рекурсивно дробить именно первую, бОльшую часть. Плюс все равно куски нужно чем-то паковать (а то охренеть ты зашифровался - куски пронумерованы в явном виде), а архиватор внесет допольнительный рандом в размеры.
Только собирать потом геморно.

thesis ★★★★★
()

Смешались в кучу кони, люди.

Я бы эту задачу в твоей постановке разбил на несколько этапов:

  1. Сформировать список отрезков на которые нужно разрезать файл.
    1. size=100
    2. chunk=15
    3. chunk=36
    4. chunk=42
    5. chunk=7
  2. Провести разрезание.
  3. Создать файл протокола с контрольными суммами кусков.
    size=100
    1 15 9920dd2dc4db9a3db6be7a973509984d
    2 36 6f98d9fcc93f8783946612c524aa5bb6
    3 42 b866fbd818d236ab5be1b92ddb43bce9
    4 7 41ea1d94a225f3a119bac1e5d327f07e
  4. Переименовать куски по протоколу в их значения md5.
  5. Протокол хранить отдельно от кусков. И по нему уже проводить восстановление.
justAmoment ★★★★★
()
Ответ на: комментарий от Spoofing

а ещё хочу добавить рандомный мусор из /dev/urandom в некоторые файлы.

то есть, для оригинала это будет дорога в один конец?
или как ты потом собираешься склеивать, выкидывая мусор?
дополнительный файл с данными о том, где мусор? это даже не смишно.

aol ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.