![Grep, 그러나 바이너리 파일의 경우](https://linux55.com/image/217570/Grep%2C%20%EA%B7%B8%EB%9F%AC%EB%82%98%20%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EA%B2%BD%EC%9A%B0.png)
데이터 복구 소프트웨어로 생성된 이미지 파일 조각이 있습니다. 전체 원본이 내 홈 파일 서버 어딘가에 있을 것 같습니다.
텍스트 파일의 조각인 경우 고유해 보이는 조각을 가져와 실행 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
perl
Sys::Mmap 모듈을 사용하세요 ( libsys-mmap-perl
Debian 패키지에 있음):
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와 같은 프로그램을 사용하면 파일을 시각적으로 나란히 비교할 수 있습니다.