2016-05-07 5 views
2

Я занимаюсь некоторыми исследованиями в области обработки изображений, и я хотел знать, можно ли его искать для конкретного гекса-строки/байтового массива на разных изображениях. Было бы здорово, если бы он дал мне список изображений, в которых есть определенная строка. В принципе, что делает grep -r "". По какой-то причине grep не выполняет эту работу. Я не знаком со струнами. Я действительно смотрел на «человеческие струны», но это мало помогло. В любом случае, я хотел бы искать определенную шестую строку, например «0002131230443» (или даже конкретный массив байтов, например, base64), в нескольких изображениях в той же папке. Любая помощь будет высоко оценен.Поиск заданной шестнадцатеричной строки в нескольких изображениях в Linux

Я нашел этот код, который точно выполняет то, что я хочу, используя xxd и grep. Вы найдете следующую команду: xxd -p/your/file | tr -d '\ n' | grep -c '22081b00081f091d2733170d123f3114'

FYI: Он вернет 1, если содержимое соответствует, 0 else.

xxd -p преобразует файл в простой шестнадцатеричный дамп, tr -d '\ n' удаляет новые строки, добавленные xxd, а grep -c подсчитывает количество согласованных строк.

Кто-нибудь знает, как выполнить код выше в определенном каталоге, используя скрипт bash. У меня около 400 изображений, и я хочу, чтобы он возвращал только 400 (т. Е. Количество совпадений строк), если все 400 изображений имеют эту конкретную строку. Я нашел этот сценарий ниже код, но он работает один и тот же код снова и снова возвращаются в 400 раз либо 0, либо 1 каждый раз:

#!/bin/bash 

FILES=/FILEPATH/* 
for f in $FILES 
do 
    echo "PROCESSING $f FILES" 
    echo "-------------------" 
    XXD -u $f | grep ABCD 
    echo "-------------------" 
done 

Спасибо, ребята.

Plasma33

+1

Да, вы правы. Я имел в виду скрипт bash. Я исправил это сейчас. К сожалению, я часто являюсь пользователем Windows. – plasma33

+0

Да, это несчастливо ;-). –

ответ

2

С GNU Grep:

#!/bin/bash 

files=/FILEPATH/* 
for f in $files 
do 
    grep -m 1 -P '\x22\x08\x1b\x00' < "$f" 
done | wc -l 
+0

Отлично !! Он работал точно так, как я хотел. Большие усилия. Спасибо, кучи !! Мне не пришлось менять порядок байтов. Например: Для grep для 22081b00 я просто сделал последовательно «\ x22 \ x08 \ x1b \ x00». Это не сработало, когда я поменял строку байтов, как вы показали. Еще раз спасибо. – plasma33

+0

Хорошо, проблема на моей стороне - это отличный вывод 'hexdump file' и' hexdump -C file'. Я обновил свой ответ. – Cyrus

+0

Нет проблем и благодарностей @Cyrus. – plasma33