/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
ls
Linux에서 실행하기 쉬운 다른 구현은 다음과 같습니다.BusyBox ls
; 또한 "전체" 줄에 1024바이트 블록 크기를 사용하며 다른 크기를 사용하도록 구성할 수 없습니다.