내 시스템에서 크기가 몇 기가비트를 넘는 모든 파일을 찾고 싶습니다. 나는 사용할 것이라고 생각했지만 find -size
매뉴얼 페이지에는 다음과 같이 명시되어 있습니다.
크기는 간접 블록을 계산하지 않습니다.
내가 올바르게 이해했다면 검색은 크기가
(number of direct blocks)×(size of a block) = 10*4096 = 40MiB
. 그렇다면 이 값보다 큰 파일을 어떻게 나열합니까?
편집하다: 매뉴얼 페이지에서 지원하기 때문에 어딘가 잘못된 것 같습니다.기가비트크기 단위로. 누구든지 내가 어디로 잘못 가고 있는지 볼 수 있습니까? 이를 반영하여 제목이 변경되었습니다.
답변1
이 링크를 통해 상황이 명확해질 것이라고 생각했는데,오픈 그룹 기본 사양 7호, IEEE Std 1003.1, 2013 에디션. 다음은 find 사양에서 발췌한 내용입니다.
사양 찾기에서 발췌
-size 피연산자는 파일 시스템에서 점유할 수 있는 블록 수가 아니라 파일 크기를 나타냅니다. 의도는 POSIX.1-2008 시스템 인터페이스 볼륨에 정의된 st_size 필드를 과거 구현에서 발견된 st_blocks 대신 사용해야 한다는 것입니다. 적어도 두 가지 이유가 있습니다:
System V 및 BSD에서 find는 POSIX.1-2008 볼륨에 지정된 피연산자에 대한 크기 계산에만 st_size를 사용합니다. (BSD는 -ls 마스터 노드를 처리할 때 st_blocks만 사용합니다.)
사용자는 일반적으로 파일 크기를 바이트 단위로 생각합니다. 이는 ls 유틸리티에서 -l 옵션의 출력에 사용하는 단위이기도 합니다. (System V 및 BSD에서 ls는 -l 옵션 크기 필드로 st_size를 사용하고 ls -s 계산에는 st_blocks를 사용합니다. POSIX.1-2008의 이 볼륨은 ls -s를 지정하지 않습니다.)
이 섹션을 올바르게 이해하면 첫 번째 섹션에서 "-size 피연산자는 파일 크기를 나타냅니다"라고 말합니다. 따라서 st_blocks 대신 st_size를 평가할 때 크기가 보고됩니다.
예
따라서 다음과 같은 명령을 사용할 수 있어야 합니다.
# find files over 1G in size
$ find / -type f -size +1G
# find files smaller than 1G in size
$ find / -type f -not -size +1G
인용하다
답변2
이 진술은 심각하게 오해의 소지가 있습니다. 잔혹한 세부 사항을 알고 싶지 않다면, 읽었다는 사실을 잊어버리고 -size
파일 크기를 보고 있다고 가정하십시오.
파일 크기는 파일에서 읽을 수 있는 바이트 수입니다. N 크기의 파일은 N 바이트의 배열입니다.
c
bytes ( ) 이외의 단위를 전달하면 -size
명령 find
은 파일 크기를 해당 단위의 배수로 반올림합니다. 예를 들어 -size 11k
10,240~11,263바이트 사이의 파일을 일치시키고, -size 12345M
12,943,622,145바이트에서 12,944,670,720바이트까지의 파일 크기를 매핑합니다. 역사적인 이유로 기본 단위는 블록이라고 하며 값은 512바이트입니다.
이것은 쉬운 부분입니다. 이제 일반적인 파일 시스템에서는 파일의 데이터가 블록에 저장됩니다. 블록 크기가 512바이트인 파일 시스템의 경우 5123바이트 파일은 11개의 데이터 블록을 차지합니다(마지막 블록은 부분적으로만 사용됨). 그래서 find -size 11
보통 11개의 블록으로 구성된 파일을 매칭합니다.
실제로 합병증이 있을 수 있습니다. 운영 체제에는 파일을 구성하는 모든 블록의 위치를 저장할 장소가 필요합니다. 블록이 너무 많으면 다른 블록의 주소를 포함하기 위해 더 많은 블록을 할당해야 합니다. 이러한 블록을 간접 블록이라고 합니다. 매뉴얼에는 find
이러한 청크가 고려되지 않는다고 나와 있습니다. find
청크를 계산하지 않고 파일 크기를 계산하므로 놀라운 일은 아닙니다.
대신 압축으로 인해 파일이 예상보다 적은 수의 블록을 사용할 수 있습니다. 클래식 유닉스 파일 시스템은 조잡한 형태의 압축만을 구현합니다. 즉, 널 바이트로만 구성된 블록은 생략될 수 있습니다. 이를 스파스 파일이라고 합니다.
프로그램은 파일이 할당된 블록 수를 알 수 있습니다 st_blocks
.stat
구조, 상대적인 st_size
. GNU find는 -ls
및 의 표시 코드에서만 이를 사용하며 -printf
어떤 조건자에도 사용하지 않습니다. 이 st_blocks
값은 파일이 디스크에서 차지하는 공간을 대략적으로 나타내며, 파일이 희소한 경우 파일 크기보다 작을 수 있지만 간접 블록을 고려하지는 않습니다.
1 Ext2, ext3 및 ext4에는 1kB, 2kB 또는 4kB 블록이 있습니다.