콘텐츠에 100% NUL 문자가 포함된 파일을 찾는 방법은 무엇입니까?

콘텐츠에 100% NUL 문자가 포함된 파일을 찾는 방법은 무엇입니까?

이러한 파일을 식별할 수 있는 Linux 명령줄 명령은 무엇입니까?

AFAIK find명령 (또는 grep)은성냥텍스트 파일의 특정 문자열입니다. 하지만 전체 내용을 일치시키고 싶습니다. 즉, 어떤 파일이 정규식과 일치하는지 확인하고 싶습니다 \0+.줄 종결자를 무시합니다.. 어쩌면 이 find . cat | grep관용구가 작동할 수도 있지만 grep이 행을 무시하도록 만드는 방법(그리고 파일을 바이너리로 처리하는 방법)을 모르겠습니다.

배경: 며칠마다 랩탑이 정지되면 btrfs 파티션에서 정보가 손실됩니다. 쓰기 위해 열려 있는 파일의 내용이 0으로 대체됩니다(파일 크기는 거의 동일하게 유지됩니다). 나는 동기화를 사용하고 이러한 가짜 파일이 확산되는 것을 원하지 않습니다. 백업에서 가져올 수 있도록 해당 파일을 식별할 수 있는 방법이 필요합니다.

답변1

grepPerl 정규식 패턴을 사용하여 ␀ 문자를 얻을 수 있습니다 .

$ echo -ne "\0\0" > nul.bin
$ echo -ne "\0x\0" > non-nul.bin
$ grep -P "[^\0]" *.bin
Binary file non-nul.bin matches

따라서 다음을 사용할 수 있습니다.

for path in *.foo
do
    grep -P "[^\0]" "$path" || echo "$path"
done

답변2

나는 문제의 근원을 찾는 것에 대해 D_Bye의 의견에 동의합니다.

어쨌든 파일에 \0다음만 포함되어 있는지 확인하려면 다음을 \n사용할 수 있습니다 tr.

<file tr -d '\0\n' | wc -c

Null/개행 문자 및 빈 파일의 경우 0을 반환합니다.

답변3

파일이 희박한 것으로 의심됩니다. 즉, 할당된 디스크 공간이 없으며 파일 크기만 지정합니다( du0이 보고됩니다).

이 경우 GNU find를 사용하여 다음을 수행할 수 있습니다(파일 경로에 개행 문자가 포함되어 있지 않다고 가정).

find . -type f -size +0 -printf '%b:%p\n' | grep '^0:' | cut -d: -f2-

답변4

널 문자 "\0"과 개행 문자 "\n"만 포함된 파일을 찾습니다. ~에
qsed해당 줄에서 null이 아닌 문자가 발견되는 즉시 각 파일 검색이 즉시 종료됩니다.

find -type f -name 'file-*' |
  while IFS= read -r file ;do 
      out=$(sed -n '1=; /^\x00\+$/d; i non-null
                      ; q' "$file")
      [[ $out == "1" ]] &&  echo "$file"
  done

테스트 파일 생성

> file-empty
printf '%s\n' 'line1' 'line2' 'line3'      > file-with-text           
printf '%4s\n' '' '' xx | sed 's/ /\x00/g' > file-with-text-and-nulls
printf '%4s\n' '' '' '' | sed 's/ /\x00/g' > file-with-nulls-and-newlines
printf '%4s'   '' '' '' | sed 's/ /\x00/g' > file-with-nulls-only

산출

./file-with-nulls-and-newlines
./file-with-nulls-only

관련 정보