100% NULL이 포함된 파일을 검색할 수 있는 방법을 찾을 수 없습니까?

100% NULL이 포함된 파일을 검색할 수 있는 방법을 찾을 수 없습니까?

데스크탑 폴더를 잃어버렸습니다(거기에 많은 파일이 있었습니다. 아마도 1000개 정도의 파일이 있었을 것입니다). 그리고 삭제된 파일을 바로 복구하는 도구를 사용했습니다. 삭제된 파일을 모두 찾아 복구한 경우. 날짜와 크기 등은 모두 괜찮아 보였습니다. 그래서 데스크탑 폴더에 다시 복사했는데, 모든 항목이 내부에 100% NUL이라는 것을 알게 되었습니다. 내 생각엔 캐리지 리턴도 없는 것 같아요. 하나의 긴 null 문자열입니다. 그래도 파일 크기는 정확합니다. 그래서..

다행히 1.5개월 전의 오래된 백업이 있어서 파일의 약 80%를 복원할 수 있었습니다.

하지만 이제 바탕 화면과 바탕 화면의 폴더 전체에 흩어져 있는 NULL로 가득 찬 파일의 20%가 있습니다.

저는 Python을 모르고 이러한 파일을 식별하는 도구를 찾을 수 없습니다. 100% NUL 00 문자로 가득 찬 파일을 찾을 수 있는 도구가 없다는 것이 나에게는 미친 것 같습니다??? 저는 이제 61세이고 은퇴했지만 소프트웨어 개발자였고 단지 이 일을 하기 위해 언어를 배우고 싶지는 않습니다. 이것은 누군가가 공유할 도구를 만들 수 있는 기회처럼 보입니다. 나는 Regex 검색을 사용하여 grepWin을 시도하고 모든 것을 검색했지만 많은 사람들이 같은 일을 시도하고 실패하는 것을 발견했습니다.

테스트할 몇 가지 샘플 NUL 파일이 있습니다. 여기에 올릴 방법이 없네요..

답변1

고마워요 폴. 어떤 이유로 나는 귀하의 답변에 대해 논평할 수 없습니다. "댓글을 달려면 평판이 50 이상 있어야 합니다"라고 나와 있습니다. 내 질문이 Unix 포럼에서 마이그레이션되었기 때문일까요? IDK..

귀하의 답변은 grep 명령입니까? 그렇다면 이에 대한 기본적인 지침도 필요합니다. 나는 grepWin(100% null 파일을 찾을 수 없음)을 검색하고 시도했으며 grep3.4를 다운로드했지만(명령이 작동하지 않습니까? 어쩌면 시스템 경로 설정이 필요할 수도 있습니까?, IDK) GnuWin을 찾았습니다. (32비트 시스템에만 해당되고 Win 10 64에 있기 때문에 내가 원하는 것은 아니라고 생각합니다.)... 초보자 튜토리얼도 검색했지만 그 중 누구도 Grep이 작동하도록 설정하세요. 모두 기본 명령을 표시하기 시작합니다.

다시 한 번 응답해 주셔서 감사합니다. 고통스럽긴 싫습니다.. 지금 약 5일 동안 이 문제를 알아내려고 노력하고 있는데 지금은 꽤 어리석은 기분이 들기 때문에 어떤 도움이라도 대단히 감사하겠습니다.

답변2

늦어서 죄송합니다. 게스트로 댓글을 달았기 때문에 귀하의 답변에 대한 알림을 받지 못했습니다.

이것은 약간의 조정이 필요할 수 있는 테스트된 스크립트입니다.

#! /bin/bash

    find 2>/dev/null . -type f -size +0c | while IFS= read -r fn; do
        NN="$( head --bytes=128 "${fn}" | tr -d '\0' | wc -c )"
        (( NN > 0 )) && continue

        NN="$( tr -d '\0' < "${fn}" | wc -c )"
        (( NN > 0 )) && continue

        printf "rm -f '%s'\n" "${fn}"
    done

작성된 대로 완전히 NUL 문자인 디렉토리 트리의 모든 파일을 제거하는 명령 목록을 생성합니다. 해당 목록을 파일로 리디렉션하여 확인한 다음 bash < myRmFile. 아니면 | bash완료 직후에 바로 넣을 수도 있습니다 .

외부 루프는 find ...; do ... done실행한 위치에서 디렉터리를 재귀적으로 검색합니다. 찾기 옵션은 최소 1바이트 크기의 일반 파일만 선택한 다음 해당 이름을 한 번에 하나씩 변수 fn으로 읽습니다.

다음 두 줄은 모든 파일 전체를 읽는 시간을 절약하기 위한 사전 검사 최적화 도구입니다. 괜찮은 파일에는 128 NUL 바이트가 없고 나중에 다른 바이트가 없기 때문에 처음 128바이트만 확인합니다.

따라서 우리는 세 가지 명령의 파이프라인에서 NN에 개수를 할당합니다. head처음 128바이트를 선택하고 모든 trNUL을 삭제하고 wc -c남은 내용을 계산합니다. NUL이 아닌 바이트가 남아 있으면 다음 파일 이름을 계속 사용합니다.

다음 두 줄은 동일한 작업을 수행하지만 "괜찮지 않은" 파일에 도달할 경우를 대비해 전체 파일에 적용됩니다.

두 검사 모두 실패하면 해당 파일에 대한 rm 명령이 생성됩니다.

이는 일부 극단적인 파일 이름(이름에 작은따옴표나 개행 문자가 포함된 파일 이름)에서는 약간 불안정합니다. 그리고 파일당 rm 프로세스를 실행하지만 약 200개만 있는 것 같아서 중요하지 않습니다.

문제가 있으면 다시 게시하세요.

관련 정보