매우 이상한 상황이 발생했습니다. 다양한 크기의 파일이 많이 포함된 파일 시스템이 있는데 파일을 정렬할 때 손상된 것 같고 아무것도 표시되지 않습니다.
이 파일이 얼마나 많은지 모르겠습니다. 주변의 다른 모든 파일과 똑같이 보입니다. 지금까지 내가 찾은 가장 좋은 방법은 find . -type f | xargs wc -l
0을 반환하는 파일을 실행하고 찾는 것입니다.
하지만 이들 파일 중 일부는 크기가 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
$
cat
1MiB의 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 -l
0을 반환합니다.
우리는 다음을 알 수 있습니다.
- 개행 문자가 포함되어 있지 않습니다(
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