파일 내용의 손상 여부를 확인하면 파일 크기가 "0"으로 표시됩니다.

파일 내용의 손상 여부를 확인하면 파일 크기가 "0"으로 표시됩니다.

매우 이상한 상황이 발생했습니다. 다양한 크기의 파일이 많이 포함된 파일 시스템이 있는데 파일을 정렬할 때 손상된 것 같고 아무것도 표시되지 않습니다.

이 파일이 얼마나 많은지 모르겠습니다. 주변의 다른 모든 파일과 똑같이 보입니다. 지금까지 내가 찾은 가장 좋은 방법은 find . -type f | xargs wc -l0을 반환하는 파일을 실행하고 찾는 것입니다.

하지만 이들 파일 중 일부는 크기가 10GB에 달하고, 비어 있어도 파일 하나를 확인하는 데 1분 이상 소요됩니다. 약 5천만개 정도의 파일을 확인해야 하는데 이는 거의 불가능합니다.

가장 큰 질문은 간단한 찾기를 실행하는 것보다 훨씬 빠르게 이러한 파일의 내용을 검사할 수 있는 낮은 수준의 방법이 있는지입니다.

답변1

그리고 파일을 검색해도 아무것도 표시되지 않습니다.

cat다음 실험에서 볼 수 있듯이 파일의 출력이 없다고 해서 파일이 비어 있다는 의미는 아닙니다.

$ truncate -s 1M foo    
$ ll foo
-rw-r----- 1 user users 1048576 Nov 15 19:28 foo
$ file foo
foo: data
$ cat foo
$ 

cat1MiB의 NUL 문자를 출력하지만 이러한 문자는 터미널에서 보이지 않습니다.

빈 파일에 대한 귀하의 질문은 다소 모호합니다. 위 사항에 foo해당되나요? "비어 있음"이 길이가 0임을 의미하는 경우 find다음을 수행하십시오.

find dir -type f -empty

아래의 길이가 0인 파일을 모두 나열합니다 dir. 당신이 find그것을 지원하지 않는 경우에 -empty, 당신은 그것을 사용할 수 있습니다 -size 0.

-s file쉘 스크립트에서는 존재하고 비어 있지 않은 경우 true 인 표현식을 사용할 수 있습니다 . file파일이 비어 있는지(존재한다고 가정) 확인하려면 다음과 같은 것을 사용하십시오.

if [ \! -s file ] ; then ... ; fi

stat(1)또는 다음은 GNU 변형을 사용할 수 있습니다 .

$ stat --format=%s foo
1048576

비교를 통해 추가로 사용할 수 있습니다.

답변2

당신의 단서에서:

  • 해당 크기는 0 또는 0이 아닌 것으로 보고됩니다.ls -l
  • cat아무것도 보여주지 않는 것 같아
  • wc -l0을 반환합니다.

우리는 다음을 알 수 있습니다.

  • 개행 문자가 포함되어 있지 않습니다( wc -l개행 개수 계산).
  • 문자가 포함되어 있으면 터미널에 표시되지 않습니다.

대부분의 제어 문자, 일부 확장 유니코드 문자 등 터미널에 표시되지 않는 문자도 많지만, 다양한 문자도 많이 있습니다.부패이 동작을 보여주는 문서를 보면 NUL 문자일 수도 있다고 생각됩니다.

데이터 블록에 대한 모든 참조가 제거된 경우 손상된 파일은 모두 0으로 처리될 수 있습니다.크기inode의 속성은 변경되지 않고 그대로 유지됩니다. 이것은 완전히 희박한 문서입니다.

inode의 블록 수 필드도 손상되지 않는 한, 다음 명령을 사용하여 이를 감지할 수 있습니다(GNU find및 GNU 가정 awk).

find . -size +0 -printf '%b%p\0' | awk -v RS='\0' '
  /^0/{print substr($0, 2)}'

즉, 크기가 0이 아니지만 디스크 사용량이 비어 있는 파일을 찾습니다.

답변3

가장 큰 질문은 간단한 찾기를 실행하는 것보다 훨씬 빠르게 이러한 파일의 내용을 검사할 수 있는 낮은 수준의 방법이 있는지입니다.

노력하다 du:

$ truncate -s 4G my4g
$ ls -l my4g
-rw-rw-r-- 1 tange tange 4294967296 Mar  4 15:34 my4g
$ cat my4g
$ du my4g
0       my4g

관련 정보