du -sh /tmp의 출력은 /tmp의 모든 파일 및 디렉터리에 대한 du의 합계보다 훨씬 큽니다. 왜? [반복하다]

du -sh /tmp의 출력은 /tmp의 모든 파일 및 디렉터리에 대한 du의 합계보다 훨씬 큽니다. 왜? [반복하다]

시스템은 기본적으로 우분투인 리눅스 민트 18.3입니다.

sudo du --apparent-size -sb /tmp생산하다476MB현재 내 시스템에 있습니다.

내가 실행 sudo du --apparent-size -sb /tmp/* /tmp/.??*하고 그것을 모두 더하면 나는 얻는다.4MB.

(-b에는 --apparent-size가 포함되어 있다는 것을 알고 있습니다. 문제를 명확히 하고 싶었습니다.)

사실, 나는 게으르기 때문에 합계를 찾기 위해 다음을 실행했습니다.

sudo du --apparent-size -sb /tmp/* /tmp/.??* | cut -f 1 | paste -sd+ - | bc

왜 차이가 있나요? /tmp에 du가 찾지 못한 숨겨진 파일이 있습니까? 아니면 내 명령에 문제가 있습니까?

편집: .dirs 및 .files를 캡처하는 데 문제가 있지만 .??*이 경우에는 .a, .b, .c 등의 파일이 없습니다.

답변1

이 상황을 재현하는 한 가지 방법은 많은 수의 빈 파일(가급적 긴 파일 이름 길이)을 생성하는 것입니다. 이렇게 하면 .파일 이름이 저장된 디렉터리( )의 크기가 확장되지만 파일 크기는 확장되지 않습니다. 파일 이름이 저장되는 디렉터리의 크기와 관련됨 ), *이러한 파일 이름이 저장되는 디렉터리 불일치):

% mkdir emptydir && cd emptydir
% du --apparent-size -sb .
6       .
% du --apparent-size -sb * | cut -f 1 | paste -sd+ - | bc
zsh: no matches found: *
% jot 100000 | while read n; do touch $n; done
% du --apparent-size -sb .
2359296 .
% du --apparent-size -sb * | cut -f 1 | paste -sd+ - | bc
0

따라서 여기서는 빈 디렉터리를 6에서 2359296으로 변경합니다. 반면 생성된 파일이 모두 비어 있기 때문에 총 glob 버전 수는 여전히 0입니다.

관련 정보