ls -lh 및 du -h는 자르기를 사용할 때 다른 파일 크기를 제공합니다.

ls -lh 및 du -h는 자르기를 사용할 때 다른 파일 크기를 제공합니다.

사용 로그 파일의 크기를 줄이는 방법을 찾으려고 합니다.

그래서 파일에 대해 다음을 시도했습니다.

$ yes > yeslog

따라서 데이터는 지속적으로 기록됩니다 yeslog.

ls -alh yeslog치수를 사용하고 확인한 후에 du -h yeslog동일한 치수가 보고되었습니다.

truncate -s 0K yeslog그런 다음 이 작업을 수행한 다음 치수를 다시 사용하고 확인합니다. 하지만 지금은 크기가 줄어들어 예전과 같은 크기를 보이고 있습니다.lsduduls

왜 이런 일이 발생합니까? 자르기가 실제로 작동합니까?

답변1

이것은 변형입니다Linux는 파일 오프셋을 어떻게 관리합니까?. ls둘 다 정확 하지만 du서로 다른 것을 측정합니다.

이를 실행하면 truncate파일이 0바이트로 줄어듭니다. 그러나 yes이전 쓰기의 오프셋에서 즉시 다시 기록됩니다. 손실된 모든 데이터는 0으로 대체되고 완전히 누락된 블록은 드물게 대체됩니다. 따라서 파일의 겉보기 크기는 계속 증가하지만 디스크에서 소비하는 실제 디스크 공간은 실행될 때마다 0으로 돌아가고, truncate쓰기 시 다시 증가하더라도 희소 블록은 계산되지 않습니다.yes

lsdu기본적으로 소비된 디스크 공간 대신 ​​파일의 겉보기 크기가 표시되므로 ls첫 번째 전체 블록이 손실된 후보다 더 큰 값이 표시됩니다. 플래그를 사용하여 할당된 크기를 표시할 수 있습니다.dutruncatels-s

쉘을 요청하면추가의yeslog( ) 로 변경하면 이전과 동일한 오프셋에서 계속되는 것이 아니라 잘린 후 파일의 시작 부분부터 yes >> yeslog파일이 열리고 기록됩니다 O_APPEND.yes

관련 정보