LINUX.ORG.RU

склеенные gzip-архивы


0

0

есть файл состоящий из нескольких склееных gzip-архивов. Существуют ли стандартные инструменты позволяющие восстановить исходные фрагменты или нужно самому писать?

формат это позволяет и это используется hg && bzr

★★★★★
Ответ на: комментарий от cvv

из моего мана:

Multiple compressed files can be concatenated. In this case, gunzip will extract all members at once. For example:

gzip -c file1 > foo.gz gzip -c file2 >> foo.gz

Then

gunzip -c foo

is equivalent to

cat file1 file2

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

вот именно

а можно из foo.gz потом доставать file1 && file2 по отдельности.

как это сделать в мане не описано и мой коллега уже сам сваял тулзу. только вопрос со стандартными тулзами ещё открыт...

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

#!/bin/sh
l=`du -b $1 |awk 'BEGIN {RS=""} {FS=""} { print $1 }'`
for (( i=0; i<=$l ; i++));do
    k=`xxd -l3 -ps -s$i $1`
    case "$k" in
    "1f8b08" ) dd if=$1 of=$1.out.gz  bs=1 skip=$i && exit 0 ;;
    "425a68" ) dd if=$1 of=$1.out.bz2 bs=1 skip=$i && exit 0 ;;
    "1f9d90" ) dd if=$1 of=$1.out.Z   bs=1 skip=$i && exit 0 ;;
    "526172" ) dd if=$1 of=$1.out.rar bs=1 skip=$i && exit 0 ;;
    "504b03" ) dd if=$1 of=$1.out.zip bs=1 skip=$i && exit 0 ;;
    esac
    k=""
done

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

для вышеописанной ситуации достаточно
#!/bin/sh
l=`du -b $1 |awk 'BEGIN {RS=""} {FS=""} { print $1 }'`
for (( i=0; i<=$l ; i++));do
    k=`xxd -l3 -ps -s$i $1`
    case "$k" in
    "1f8b08" ) dd if=$1 of=$1.$i.out.gz  bs=1 skip=$i ;;
    esac
    k=""
done
только это гораздо медленнее чем на ЦЭ

botrops-schlegelii ★★
()

#!/bin/sh
#вот наиболее совершенный вариант от меня
l=`ls -l $1 |awk 'BEGIN {FS=" "} { print $5 }'`
m=$1
n=$m
counter=0
for (( i=0; i<=$l ; i++));do
    k=`xxd -l3 -ps -s$i $n`
    case "$k" in
    "1f8b08" ) counter=$((${counter}+1)) headpos[${counter}]=`echo $i` \
     && echo ${counter}:${headpos[${counter}]} ;;
    esac
    k=""
done
counter=$((${counter}+1)) 
headpos[${counter}]=`echo $l`
revcounter=${counter}
echo ${revcounter}
echo ${headpos[${revcounter}]}
while [ ${revcounter} -gt 1 ] ;do
    end=${headpos[${revcounter}]}
    start=${headpos[$((${revcounter}-1))]}
    skip=$((${end}-${start}))
    echo "from ${start} to ${end}"
    dd if=$m of=$m.$((${revcounter}-1)) skip=${start} bs=1 count=${skip}
    revcounter=$((${revcounter}-1))
done 

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

ты конечно гений но скрипт мы уже и сами написали...

а общая картина ситуации ещё не сформировалась :(

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

>ты конечно гений но скрипт мы уже и сами написали...
ну покажи - может мне тоже интересно ...

botrops-schlegelii ★★
()
Ответ на: удаленный комментарий

колега обещал выложить в публичный доступ - как выложит если не забуду дам линк;)

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