LINUX.ORG.RU

Наличие данных в конце бинарного файла

 ,


0

2

Хочу написать баш-скрипт, который проверяет бинарные файлы и если в конце его есть нужна строка, то отрезает n-ое количество байт от файла. Если с последним в целом понятно и есть truncate, то вот с первым проблемка. Сначала хотел через strings вытащить все строки и проверить последнюю, но проблема в том, что данная строка может быть и в середине файла. Единственный костыль придумал через stat и dd отрезать начало файла и потом грепать его:

#!/bin/bash
declare -i truncsize=0
filesize=$(stat -c%s "$1")
truncsize="$filesize - 10"

dd if="$1" of=/tmp/out.qwe skip=$truncsize bs=1
if grep -q "teststring" /tmp/out.qwe;
then
  truncate -s -10 "$1"
else
  echo NORM
fi

Интересует, если какой-нибудь более короткий способ проверить конец бинарного файла?


Короче чем grep, который для этого и создан? А быстрее работать будет если на c переписать.

anonymous
()

и если в конце его есть нужна строка
данная строка может быть и в середине файла

Не понял.

Zmicier ★★★★★
()

Если «бинарный» - это нечто более конкретное (elf,zip,png....), то возможно найдётся быстрый способ проверки.

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

Есть бинарный файл. Нужно проверить строку «teststring» в конце файла(последние 10 байт), эта же строка можешь быть и в середине файла. Реагировать нужно на первый случай.

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

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

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

С cmp вроде понятно всё. Короче явно не получится придумать. А вот diff же для текстовых файлов(костыль с перегоном в hex явно не то). vbindiff уже гуй. С грепом опять не понятно как бинарник сравнить в конце файла.

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

Да простой бинарный файл со своей самописной структурой.

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

Да. Конец именно этой строке. В целом пельчальбеда, думал что есть что-то покороче и поудобней.

s1n
() автор топика

Есть не вполне чудесный способ, но всё же он есть:

f=$(</bin/bash)
[[ ${f:$((${#f}-10)):10} == 'teststring' ]] && {
  echo 'FOUND'
}

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

Вот жеж блин. Про tail не подумал почитать, думал, что он только для текстовых файлов. В целом это то, что мне нужно. Спасибо.

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

Вам спасибо! Благодаря данной задачке я весьма внезапно узнал, что, оказывается, первый мой пример работает неправильно на бинарных файлах (сличал hexdump'ом). Сюрприз...

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

Да. Конец именно этой строке.

Ну тогда элементарно. Псевдокод

size=$(stat --format='%s' $FILE)
str=$(dd if=$FILE bs=1 skip=$((size-$LENGTH)) 2> /dev/null )
if [ x"$str" = x$FIND_STR ]; then
  truncate
fi
vodz ★★★★★
()
Ответ на: комментарий от DRVTiny

Аналогично всем спасибо! Благодаря этой задачке я узнал, что lseek() при работе с конца требует отрицательные значения вместо положительных! Сюрприз...

// Я написал прогу на C для ТС-а по приколу, но т.к. уже решение есть, ты смысла в ней не вижу.

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

Еще заметил такую вещь.

#!/bin/bash
rightstr="teststring"
checkstr=$(tail -c10 "$1")
if [ "$rightstr" = "$checkstr" ]
then
  truncate -s -10 "$1"
else
  echo ok
fi

В итоге баш пишет варнинг на вторую строчку, если tail возвращает NULL-байт.

./test2.sh: строка 3: предупреждение: command substitution: ignored null byte in input
ok
Что-то не получилось его заткнуть. Ни через «> /dev/null 2>&1», ни через "-q".

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

Ты бы лучше вспомнил об своих обещаниях.

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

Будь достойным своих слов, а не трепись как баба.

anonymous
()
16 декабря 2017 г.
Ответ на: комментарий от anonymous

Не совсем понял при чем тут shar.

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