Grep、しかしバイナリファイルの場合

Grep、しかしバイナリファイルの場合

データ復旧ソフトウェアで生成された画像ファイルの断片があります。ソース全体が私のホームファイルサーバーのどこかにあるようです。

テキストファイルの断片の場合は、一意に見える断片をインポートして実行しgrep -r -l -F、数時間後に戻って回答を得ることができます。しかし、バイナリファイルなので、気に入らないもの(たとえば、nullバイト)がすべて含まれており、それを克服できても誤った入力UTF-8をgrep提供する方法がわかりません。grep

可能であれば、独自の検索プログラムを作成せずに元のテキストを検索するにはどうすればよいですか?

(重複ではありません。この問題: タイトルがどのように聞こえるか、バイナリファイル内の文字列を探す内容ですが、私はバイナリファイルからバイナリデータを探しています。 )

答え1

私は何をしますか:

grep -a -r -l -F <fixed string> .

-a、--text
バイナリファイルをテキストのように処理します。これは --binary-files=text オプションと同じです。

または

find . -type f -exec sh -c '
    strings "$1" | grep -lF <fixed pattern>
' sh {} \;
 

strings - ファイルに印刷可能な文字シーケンスを印刷します。

答え2

あなたはできますまず、次のようにバイナリをダンプします。OD:

grep の効率を最大化するために、-x オプションと -w256 オプションを使用してファイルのサイズと行数を減らすことをお勧めします。不要なオフセットアドレスを削除するには、-A nオプションを使用する必要があります。

od -x -A n -w256 yourbinary_fragment > pattern.txt

また、-j -N オプションと -w オプションを積極的に使用するか、Pattern.txt を再編集して、行数を最小限に減らすこともできます。 (grepの作業をかなり簡単にするため)

それからパターンに一致するファイルを探す捨てられた後

find . -type f -exec sh -c '
    od -x -A n -w256 "$1" | grep -lFf pattern.txt
' sh {} \;

コンピュータを他の目的に使用する場合は、SCHED_BATCHプロセスをお勧めします。

答え3

perlSys::Mmap モジュールを使用してください( libsys-mmap-perlDebian パッケージにある):

fragment=/path/to/your/fragment
size=$(( $(wc -c < "$fragment") - 1 ))
find . -type f -size "+${size}c" -print0 | 
  perl -MSys::Mmap -l -0sne '
    BEGIN {
      open N, "<", $needle or die "$ARGV[0]: $!\n";
      mmap($n, 0, PROT_READ, MAP_SHARED, N);
    }
    if (open H, "<", $_) {
      mmap($h, 0, PROT_READ, MAP_SHARED, H);
      print if index($h, $n) >=0;
    } else {
      warn "$_: $!\n";
    }' -- -needle="$fragment"

答え4

あるファイルが別のファイルの最初の部分であると疑われる場合は、両方のファイルから最初の数バイトを取得して比較できます。

# Omit or change the bytes arguments as needed, see `man head`
head --bytes=1032 file1.bin > /tmp/file1.head.bin
head --bytes=1032 file2.bin > /tmp/file2.head.bin
diff --text /tmp/file.head.*

を使用してファイルを視覚的に表示することもできますxxd /tmp/fil1.head.bin。最後に、MeldやBeyond Compareなどのプログラムを使用すると、ファイルを視覚的に並べて比較できます。

関連情報