내가 아는 한, "-s" 옵션이 있는 ls 명령은 파일 크기를 블록 단위로 인쇄하고, ls는 블록 크기로 1024를 사용하지만 이상한 점을 발견했습니다.
더 나은 이해를 위해 ls -ls 명령의 다음 출력을 고려하십시오.
12-rw-r--r--. 1 루트 10240 7월 15일 19:22 z
파일 크기가 10240바이트이고 블록 크기가 1024이므로 이 파일의 블록 수는 10240/1024 = 10블록인데 왜 ls
12블록으로 표시되는 걸까요?
인사
답변1
여기에 실제로 보고되는 것은 ls
파일에 할당된 블록 크기입니다. 크기는 12KB입니다.
이 크기는 전통적으로 512B의 "블록"으로 보고되는데, 그 이유는 고대 Unix 시스템에서는 실제로 512바이트 블록이 많았기 때문입니다. 그러나 블록 크기는 파일 시스템에 따라 다르며 ls
동일한 단위를 사용합니다. GNU 도구는 512B 대신 1kB를 단위로 사용합니다. 킬로바이트가 인간에게 0.5킬로바이트보다 더 의미가 있기 때문입니다.
Ext4 및 기타 여러 공통 파일 시스템의 기본값은 4kB 블록입니다. 따라서 10240바이트 파일은 크기가 12kB인 3개의 블록을 차지합니다.
당신은 또한 볼 수 있습니다파일 블록 크기 - stat와 ls의 차이그리고블록 크기와 클러스터 크기의 차이점.
답변2
이것은 좋은 질문입니다. 읽은 후자일스의 대답, 강제로 읽어야 했고 man ls
,ls --help
닫다왜냐하면 나는 그의 대답이 틀렸다고 확신하기 때문입니다. 대신, 나는 그가 옳았다는 것을 증명하기 위해 이 대답을 제시합니다! :피
ls -ls
1024바이트 파일의 결과는 다음과 같습니다.
12 -rw-r--r--. 1 root root 10240 Jul 15 19:22 z
우리가 이를 믿고 man ls
문제의 파일이 10,240바이트라고 주장한다면 이 결과는 파일의 크기가 다음과 같다는 것을 알려줍니다.12 blocks
, 그러나 이 결과는 이러한 블록의 크기를 알려주지 않습니다. 블록 크기를 이해하기 위해 관련 단락을 참조하면 man ls
우리는 거의 빈손으로 나옵니다.
관련 단락은 man ls
다음과 같습니다.
--block-size=SIZE
with -l, scale sizes by SIZE when printing them; e.g., '--block size=M'; see SIZE format below
-k, --kibibytes
default to 1024-byte blocks for disk usage; used only with -s and per directory totals
-s, --size
print the allocated size of each file, in blocks
The SIZE argument is an integer and optional unit (example: 10K is 10*1024). Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
믿음에 의지하지 않음:
다음과 같이 10,240바이트 파일을 생성합니다.
fallocate -l 10240 lstest.txt
확인하다:
wc -c lstest.txt
10240 lstest.txt
ls -l
12 -rw-r--r-- 1 pi pi 10240 Jan 4 12:09 lstest.txt
ls -ls
12 -rw-r--r-- 1 pi pi 10240 Jan 4 12:09 lstest.txt
ls -lks
12 -rw-r--r-- 1 pi pi 10240 Jan 4 02:09 lstest.txt
ls -ls --kibibytes
12 -rw-r--r-- 1 pi pi 10240 Jan 4 02:09 lstest.txt
말씀하신대로 이런거 같네요이상한문서에 따르면 12 * 1,024 = 12,288바이트이므로 10,240바이트보다 큽니다.
그러나 탈출구가 있습니다.
세 가지 사항을 고려하십시오.
- 이
-s
옵션은 보고서allocation
파일 크기가 아님(참조man ls
) - 블록 크기는추상적인파일 시스템에 정의되어 있습니다. 물리량은 아니지만,효율적인블록 크기를 다음과 같게 만듭니다.고급 형식 섹터 크기4,096바이트. 2011년 1월 이후 제조된 모든 HDD는 고급 포맷 표준을 준수합니다.
- 파일 시스템의 블록 크기를 결정할 수 있습니다.
stat -fc %s .
# or, if you prefer:
stat -fc %s lstest.txt
# which is, in both cases (on my ext3 filesystem):
4096
마지막으로 몇 가지 답변
1. 위의 결론:ls
파일 시스템에서 사용하는 블록 크기를 모릅니다.
ls
2. 블록 크기를 알고 있다면 이를 다음과 공유해야 합니다 .
ls -ls --block-size=4K
3 -rw-r--r-- 1 pi pi 3 Jan 4 02:09 lstest.txt
3 * 4,096 = 12,288바이트입니다. 또한 블록 크기(4,096바이트)는양자블록 장치의 저장 공간, 즉 저장 할당이 변경될 수 있는 최소 크기입니다. 이제 12,288바이트가 실제로 필요한 바이트 할당이라는 것이 분명해졌습니다. 그러나 블록에서 정답을 얻으려면 옵션을 통해 시스템의 블록 크기를 알려 man ls
주어야 합니다 .ls
--block-size=4K
3. 자일스의 대답이 맞았다
심사 숙고:
제 생각에는 man ls
그다지 명확하지 않습니다. 어쩌면 파일 시스템 블록 크기를 모른다고 명시하도록 수정되어야 할까요?
더 나은 방법은 ls
시스템에서 블록 크기를 가져오도록 수정하는 것입니다. 결국 stat
그것은 그것의 일부입니다 GNU coreutils 8.30
.
답변3
이것이 기본값이 되었기 때문에 기본 파일 시스템의 블록 크기는 4k일 가능성이 높습니다. 따라서 10.240바이트 파일에는 3개(ceil(10.240/4096)) 파일 시스템 블록이 필요합니다. 3개의 4k 블록, 각각 3 * 4 = 12개의 1k 블록으로 보고됨