Linux는 /bin/ls -l을 실행할 때 총 블록 수를 어떻게 계산합니까?

Linux는 /bin/ls -l을 실행할 때 총 블록 수를 어떻게 계산합니까?

/bin/ls -l프로그램이 디렉토리의 전체 크기(블록 수)를 계산하는 방법을 알아내려고 합니다 . 디렉토리 내용 앞에 인쇄되는 출력을 의미합니다.total number

여기에도 비슷한 질문이 있습니다.https://stackoverflow.com/questions/7401704/what-is-that-total-in-the-very-first-line-after-ls-l그러나 질문에 완전히 답하지도 않고 계산 방법을 정확하게 설명하지도 않습니다.

추가해 보았습니다할당된 512B 블록 수 디렉터리에 있는 모든(숨겨지지 않은) 파일에 사용됩니다. 내가 시도한 것은 다음과 같습니다(C에서).

 int getBlockSize(char* directory) {
   int size = 0;

   DIR *d;
   struct dirent *dir;
   struct stat fileStat;
   d = opendir(directory);
   if (d) {
       while ((dir = readdir(d)) != NULL) {
           if (dir->d_name[0] != '.') { // Ignore hidden files
               // Create the path to stat
               char info_path[PATH_MAX + 1];
               strcpy(info_path, directory);
               if (directory[strlen(directory) - 1] != '/')
                   strcat(info_path, "/");
               strcat(info_path, dir->d_name);

               stat(info_path, &fileStat);

               size += fileStat.st_blocks;
           }
       }
   }

   return size;
}

그러나 이것은 명령과 비교하여 매우 다른 숫자를 제공합니다 ls.

내 접근 방식에 "잘못"이 무엇입니까? ls총액은 어떻게 계산되나요?

편집하다:

테스트하기 위해 파일이 포함된 폴더를 만들었습니다 test_file1.txt. test_file2.txt각 파일에는 텍스트가 포함되어 있습니다 Hello World!. 내가 실행하면 ls -l다음과 같은 결과가 나타납니다.

total 1
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file1.txt
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file2.txt

그러나 위의 방법을 사용하여 코드를 실행하면 다음과 같은 결과가 나타납니다.

total 2
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file1.txt
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file2.txt 

답변1

우분투에서 기본값 ls은 다음과 같습니다.암소 비슷한 일종의 영양ls, 어느기본값은 1024바이트 블록 크기입니다."전체" 라인입니다. 이는 귀하의 방법과 귀하의 방법 사이의 출력 차이를 설명합니다 ls. 귀하의 방법은 512바이트 블록을 계산하기 때문에 블록 수가 두 배로 표시됩니다.

GNU가 512바이트 블록으로 계산하도록 하는 방법에는 여러 가지가 있습니다 ls(위 링크 참조). 가장 신뢰할 수 있는 방법은 다음과 같이 설정하는 것입니다 LS_BLOCK_SIZE.

LS_BLOCK_SIZE=512 ls -l

lsLinux에서 접할 수 있는 또 다른 구현은 다음과 같습니다.바쁜 상자 ls;또한 "전체" 행에 대해 1024바이트의 블록 크기를 사용하며 다른 크기를 사용하도록 구성할 수 없습니다.

관련 정보