LINUX.ORG.RU

sh-скрипт - поиск в бинарном файле - как сделать быстрее ?


0

0

вот написал скрипт, для выдирания архивов из
всяких там makeself.bin и тд;
жутко медленный - как сделать быстрее (на shell) ?

#!/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
done

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

это то ясно -
только что вспомнил про другие параметры dd
- просто ,вероятно(?), надо будет заменить
bs=1 skip=$i
на
ibs=1 obs=32k skip=$i

типа:

"1f8b08" ) dd if=$1 of=$1.out.gz ibs=1 obs=32k skip=$i && exit 0 ;;

- по идее должно дать выигрыш в скорости ...
зы
man dd рулит - а я забыл это ...

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

а ты уверен, что то человек, который запаковывал файлы в сраный makeself,инсталлшилд или просто сраный-sfx, выравнивает положение заголовка файла на 32k в теле sfx ?
я уверен , что не выравнивает(сам так делаю) - поэтому я последовательно перебираю 3 байта hex-дампа из потока...

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

не поможет - решил искать не там где потерял, а там где светло :
$
$cat ./shell.sh
a=`echo 1024*1024|bc -l`
for (( b=0; b<=$a ; b++));do
echo $b >/dev/null
done
$
$time ./shell.sh
real ~1m17s
$
$cat ./seq.sh
a=`echo 1024*1024|bc -l`
for b in `seq 0 $a`;do
echo $b >/dev/null
done
$
$time ./seq.sh
real ~0m59s #будем считать ~1m
$

то есть;
$echo "650*1024*1024/(1024*1024)/60/24"|bc -l
.45138888888888888888
$
за пол суток я найду заголовок bzip2 архива в конце 650Mb имиджа cdrom
- надо искать _неинтерактивный_ hex-dumper, с функцией поиска ...

ps
Pentium-3 , linux-2.4.32

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

ИМХО, за сутки (которые уже прошли с момента начала этой темы) уже можно было на С написать прогу...

>l=`du -b $1 |awk 'BEGIN {RS=""} {FS=""} { print $1 }'`

почему размер файла берется через du, а не через "ls -l" или "stat"?

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

>почему размер файла берется через du, а не через "ls -l" или "stat"?
это не важно - мне бы побыстрее заголовок найти
>уже можно было на С написать прогу...
или на F77

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

http://www.mcsr.olemiss.edu/cgi-bin/man-cgi?du
"ls -l" не очень удобно - в плане сортировки вообще - в скриптах ,IMHO, лучше find
ps

du -b
-b, --bytes
equivalent to '--apparent-size --block-size=1'

и чем это не так если

ls --block-size=1

--block-size=SIZE
use SIZE-byte blocks

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

>"ls -l" не очень удобно - в плане сортировки вообще - в скриптах ,IMHO, лучше find

Кому как... Хотя я не понял про сортировку

>и чем это не так если

Да мне без разницы, разве что раньше du не понимал --apparent-size.

Ну дак на каком языке будешь прогу писать? :))

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

пока поищу неинтерактивный hex-dumper - чтобы выдавал положение искомого сегмента; потом ,может быть, фортран-77 буду вспоминать
Ж-)

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