Não consegui criar uma ferramenta existente.
grep -F --binary --byte-offset --only-matching
parece estar perto o suficiente - mas você não pode escapar de novas linhas com -F
.
E cmp
só permite ignorar caracteres. diff
também não parece ser de muita ajuda.
Mas é um pouco de liner em uma linguagem de programação com uma biblioteca decente. Por exemplo, como um programa C ++ usando o Boost:
#include <boost/algorithm/string/find.hpp>
#include <boost/iostreams/device/mapped_file.hpp>
#include <cassert>
#include <iostream>
using namespace boost;
using namespace boost::algorithm;
using namespace boost::iostreams;
using namespace std;
int main(int argc, char **argv)
{
if (argc != 3) {
cerr << "Call: " << argv[0] << " PATTERN_FILE SRC_FILE\n";
return 3;
}
mapped_file_source pattern(argv[1]);
mapped_file_source src(argv[2]);
iterator_range<const char*> p_range(pattern.data(),
pattern.data() + pattern.size());
iterator_range<const char*> s_range(src.data(), src.data() + src.size());
iterator_range<const char*> result = find_first(s_range, p_range);
if (result) {
size_t pos = result.begin()-s_range.begin();
cout << pos << '\n';
return 0;
}
return 1;
}
Você pode compilar assim (quando a fonte do programa é salva como find.cc
):
$ make CXXFLAGS="-Wall -g" LDLIBS="-lboost_iostreams" searchb
Para testar:
$ dd if=WTF_-_EPISODE_277_RACHAEL_HARRIS.mp3 of=t skip=232323 bs=1 count=4K
$ ls -l t
-rw-r--r-- 1 juser users 4096 2012-05-31 15:24 t
$ ./searchb t WTF_-_EPISODE_277_RACHAEL_HARRIS.mp3
232323
A saída é a posição correspondente no arquivo de origem.
Se o arquivo não estiver contido, o status de saída será 1
.
Update: Nesse meio tempo, implementei esta ferramenta simples em várias linguagens (C / C ++ / Python / Rust / Go) e incluí essas implementações em minha . Procure por searchb*
. A implementação do Python é a mais curta e não requer dependências externas.