ls -s가 잘못된 블록 크기를 사용합니다.

ls -s가 잘못된 블록 크기를 사용합니다.

우분투 리눅스:LS-S동의하지 않는다&통계자료~을 위한블록 수작은 파일에 사용됩니다.

ls -s  ../nc2/.git/logs/refs/heads/ 
total 4

du  ../nc2/.git/logs/refs/heads/ 
8   ../nc2/.git/logs/refs/heads/

stat ../nc2/.git/logs/refs/heads/   
File: ‘../nc2/.git/logs/refs/heads/’   
Size: 4096          Blocks: 8          IO Block: 4096 ......

sudo blockdev --getbsz /dev/sda
4096

ls -s는 4개의 블록을 사용하는 파일을 표시합니다. du & size에서는 8개의 블록을 사용한다고 합니다.

ls -s가 잘못된 것처럼 보이는 이유는 무엇입니까? 올바른 블록 크기를 감지할 수 없습니까? "ls -s --block-size 512"를 실행하여 파일이 8개의 블록을 사용한다는 것을 보여줄 수 있습니다.

파일 크기와 블록 수의 문제가 아닙니다. 위의 모든 명령은 파일 크기 대신 블록 크기를 나열합니다.

편집: 추가 정보 요청:

ls --version 
ls (GNU coreutils) 8.21

type ls  
ls is aliased to `ls --color=auto'

LS_BLOCK_SIZE=512 ls -s ../nc2/.git/logs/refs/heads/ 
total 8

답변1

ls -s보고서/시스템 호출 st_blocks에 의해 반환된 구조체 멤버입니다 . 이는 512바이트 블록입니다. 512바이트는 초기 디스크 섹터에 해당하므로 일반적으로 최소 저장 단위입니다.stat()lstat()

또는 적어도 ls원래 Unix 구현과 POSIX가 요구하는 것을 포함하여 대부분의 구현이 수행하는 작업입니다.

그러나 GNU 구현 ls(우분투에서 발견되는 에뮬레이션)은 이를 1024바이트 청크로 변경하지만 busybox(이전) 변수가 환경에 있는 경우(busybox에서는 작동하지 않음) 512바이트 청크로 대체됩니다. 이는 사람이 읽기 쉽도록 하기 위한 것이라고 생각하지만 이는 512바이트 저장 단위를 사용하는 파일 시스템의 정밀도를 잃고 이식성에 도움이 되지 않는다는 것을 의미합니다.$POSIXLY_CORRECT$POSIX_ME_HARDER

변경 로그에서:

Wed Aug 21 13:03:14 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)

  • 버전 3.0.

  • du.c, ls.c: 1K 블록을 기본 크기로 설정하고 -ka는 작동하지 않습니다. 어리석은 기준은 이제 그만!

GNU(busybox 아님)의 경우 옵션 이나 환경 변수를 ls통해 블록 크기를 지정할 수도 있습니다 . 따라서 또는 를 사용하여 디스크 사용량을 바이트 단위로 얻을 수 있습니다. 이 기능( GNU에서도 인식됨) 에 대한 다른 구현(예: BSD의 구현)은 다음과 같이 인식됩니다.--block-size$LS_BLOCK_SIZEls --block-size=1 -sLS_BLOCK_SIZE=1 ls -sls$BLOCKSIZE$BLOCK_SIZEls@yahol이 표시함).

POSIXly에서는 이를 사용하여 -k킬로바이트 단위로 개수를 얻을 수 있습니다(다행히 GNU 또는 BSD가 환경 변수 ls보다 우선합니다 ).$BLOCKSIZE

이식 가능하게(KB 단위 보고가 하드코딩되어 있는 busybox 를 고려하려는 경우 ls) 반환 st_blocks(또는 적어도 대략적인 값)하려면 다음과 같은 것이 필요합니다.

blocks=$(ls -skd -- "$file" | awk '{print $1*2; exit}')

GNU를 사용하면 find환경 에 관계없이 -printf %b많은 512바이트 청크와 -printf %k1024바이트 청크가 보고됩니다. -printfGNU에만 해당됩니다.

어쨌든, 이제 이것은 파일 시스템 블록 크기와 아무 관련이 없습니다.


1 BSD에서는 512( 동일 ) $BLOCKSIZE의 배수로 반올림하며 , 512 미만의 값은 허용되지 않습니다.BLOCKSIZE=1023BLOCKSIZE=512

답변2

info coreutils Block size이것은 (내가 방법을 찾은 곳)에 설명되어 있습니다 info ls.

2.3 Block size

(...)The block size used for display is independent of
any file system block size.(...)

‘DF_BLOCK_SIZE’
     This specifies the default block size for the ‘df’ command.
     Similarly, ‘DU_BLOCK_SIZE’ specifies the default for ‘du’ and
     ‘LS_BLOCK_SIZE’ for ‘ls’.

이러한 각 프로그램은 환경 변수에 정의된 서로 다른 블록 크기를 사용할 수 있는 것으로 보입니다.

다음 두 env변수는 출력을 통합하는 데 도움이 될 수 있습니다.

‘BLOCK_SIZE’
     This specifies the default block size for all three commands, if
     the above command-specific environment variables are not set.

‘BLOCKSIZE’
     This specifies the default block size for all values that are
     normally printed as blocks, if neither ‘BLOCK_SIZE’ nor the above
     command-specific environment variables are set.  Unlike the other
     environment variables, ‘BLOCKSIZE’ does not affect values that are
     normally printed as byte counts, e.g., the file sizes contained in
     ‘ls -l’ output.

이는 512개 블록의 기본값을 설명합니다.

‘POSIXLY_CORRECT’
     If neither ‘COMMAND_BLOCK_SIZE’, nor ‘BLOCK_SIZE’, nor ‘BLOCKSIZE’
     is set, but this variable is set, the block size defaults to 512.

관련 정보