한 글자가 포함된 파일에 대해 ls -l을 실행하면 파일 크기는 2B로 나타납니다. 파일 시스템이 4k 블록인 경우 파일을 블록 크기로 반올림한다고 가정합니까? ls -l이 실제로 inode에서 바이트 수를 읽기 때문입니까? 어떤 상황에서 Linux 2.6 커널 GNU 유틸리티에서 블록 답변을 실제 바이트 답변으로 반올림하시겠습니까?
답변1
echo a > file
or 를 사용하여 이 문자 하나를 파일에 넣은 것 같습니다 vim file
. 이는 해당 문자와 추가 줄 바꿈(2자, 따라서 2바이트)을 갖게 된다는 의미입니다. ls -l
파일 크기를 블록이 아닌 바이트 단위로 표시합니다(구체적으로는 file길이):
$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$
(개행 문자는 문자 cat -A
로 표시됩니다 .)$
다음과 비교하여 디스크에서 차지하는 실제 크기를 표시합니다 ls -l
.du
$ du testfile
4
(실제로 du
크기는 1kiB 단위로 표시되므로 여기서의 크기는 4×1024바이트 = 4096바이트 = 4kiB, 즉 이 파일 시스템의 블록 크기입니다.)
이를 표시 하려면 다음 대신/추가로 ls
이 옵션을 사용해야 합니다 .-s
-l
$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
첫 번째 열은 할당 크기(1kiB 단위)입니다. 마지막으로 이는 를 지정하여 변경할 수 있습니다 --block-size
.
$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile
답변2
제가 생각하는 심오한 대답은 다음과 같습니다.
논리적 파일 길이와 차지하는 디스크 공간은 실제로 다릅니다.
다른 답변에서 알 수 있듯이 원칙적으로 2바이트로 생성된 파일은 2바이트 길이(로 표시 ls -l
)이고 4KiB( du
또는로 표시 ls -ls
)를 차지합니다.
바라보다:
1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test
좋습니다. test
길이는 1이고 크기(디스크)는 4KiB입니다. 하지만:
1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4 test
(첫 번째 명령은 8191 0바이트를 추가했습니다 test
.) 이제 테스트된 길이는 8192이지만 여전히 디스크에서 4KiB를 차지합니다("구멍"이 있음)(1).
일부 파일 시스템은 공유 블록을 통해 공간을 덜 차지하도록 짧은 파일을 압축할 수도 있습니다(예제 참조).꼬리 포장) 다른 사람btrfs와 마찬가지로 쓰기 중 복사, 따라서 파일, 논리적 길이 및 디스크에서 차지하는 공간 간의 관계는 복잡합니다.
각주:
(1)사실 이건 구멍이 아니예요, 끝에 있습니다...하지만 예제가 끝날 때까지 계속 작동합니다.
답변3
ls -l
그냥 긴 형식입니다. ls -ls
블록 크기를 표시하는 데 사용됩니다.
시험
echo "1" > 1.txt
bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt
파일 크기가 2B로 표시되는 것을 볼 수 있습니다. 하지만 블록 크기를 확인해야 하는 경우에는 다음 명령을 실행해야 합니다.
bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt
위의 4는 사용된 블록 크기를 보여줍니다. 명령을 사용하여 이를 확인할 수도 있습니다 stat
.
bash-3.2$ stat 1.txt
File: `1.txt'
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: 805h/2053d Inode: 48267720 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 505/ ramesh) Gid: ( 508/ ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500
ls -ls
이제 블록 크기는 4로 표시되지만 stat
블록 크기는 8로 표시되는 이유에 대한 질문이 발생합니다 . 이 동작의 이유는 답변에 명확하게 설명되어 있습니다.여기.
많은 디스크의 섹터 크기는 512바이트입니다. 이는 디스크에 대한 읽기 또는 쓰기 작업이 전체 512바이트 섹터를 한 번에 전송한다는 의미입니다. 파일 간에 섹터가 분할되지 않도록 파일 시스템을 설계하는 것은 당연합니다(이로 인해 설계가 복잡해지고 성능이 저하됨). 따라서 파일 시스템은 파일에 512바이트 블록을 사용하는 경향이 있습니다. 따라서 및 등의 기존 유틸리티는 크기를 512바이트 블록
ls
으로 나타냅니다.du