"find . -size" 명령의 파일 크기 옵션은 무엇입니까?

"find . -size" 명령의 파일 크기 옵션은 무엇입니까?

파일 크기를 바이트 단위로 찾으려면 'c'를 사용한다는 것을 알았습니다.

따라서 다음을 사용하여 1000바이트의 파일 크기를 찾을 수 있습니다. -크기 1000c

하지만 Mb, Gb 또는 비트와 같은 다양한 종류의 크기는 어떻습니까? 어떤 문자를 사용해야 합니까?

답변1

POSIX접미사를 지정하지 않거나 c접미사만 지정합니다. 접미사가 없으면 값은 512바이트 블록으로 해석됩니다. 접미사가 있으면 c값은 사용자가 결정한 대로 바이트 수로 해석됩니다.

일부 구현에서는 더 많은 접미사를 지원합니다. 예를 들어암소 비슷한 일종의 영양find지원하다

  • b512바이트 블록의 경우
  • c바이트용
  • w2바이트 단어의 경우
  • k키비바이트용
  • M메비바이트용
  • G기비바이트용

답변2

POSIX적으로:

find . -size  1000c # files whose size¹ is exactly 1000 bytes (not characters)
find . -size -1000c # strictly less than 1000 bytes (0 - 999)
find . -size +1000c # strictly more than 1000 bytes (1001 - ∞)

그런 다음 POSIX sh구문을 사용하여 다음을 수행할 수 있습니다.

EiB=$((1024*(PiB=1024*(TiB=1024*(GiB=1024*(MiB=1024*(KiB=1024)))))))
 EB=$((1000*( PB=1000*( TB=1000*( GB=1000*( MB=1000*( kB=1000)))))))

find . -size "$(( 12 * GiB ))c" # exactly 12GiB (12,884,901,888 bytes)
find . -size "$(( 12 * GB  ))c" # exactly 12GB (12,000,000,000 bytes)
find . -size "-$(( 12 * GB ))c" # 0 - 11,999,9999,999 bytes
...

접미사 가 없으면 c동작이 놀랄 수 있으니 주의하세요.

find . -size  1000 # files whose size, in number of 512-byte units (rounded *up*)
                   # is 1000. So, that's file whose size in bytes ranges from
                   # 1000*512-511 (999*512+1) to 512*1000
find . -size -1000 # files whose size is 999*512 bytes or less
find . -size +1000 # files whose size is 1000*512+1 bytes or more

이것이 find유틸리티의 POSIX 사양에 대한 것입니다.

이제 다양한 find구현이 추가 접미사를 지원하지만 동일한 접미사가 구현마다 다르게 해석될 수 있다는 점에 유의하세요.

처럼@StephenKitt가 언급함,암소 비슷한 일종의 영양find바이트, 워드, 512바이트 단위, 키비바이트, 메비바이트, 기비바이트를 지원 하지만 POSIX 에서 요구 cwbkMG하는 것처럼 동작합니다. 예를 들어 기비바이트 수(반올림)의 크기가 엄격하게 지정된 파일이므로 위에서 설명한 것과 동일하지 않습니다. 12개 미만, 즉 11GiB 이하의 파일입니다.findfind . -size -12Gfind . -size "-$((12 * GiB))c"

예를 들어 find . -size -1G빈 파일(크기가 0인 파일)만 찾습니다. 1바이트 파일은 크기가 다음 GiB로 반올림되므로 1GiB로 간주됩니다.

비지박스find접미사를 지원 cwbk하지만 GNU와 다르게 해석합니다 find. 그것은 또한현재 접미사 없이 크기를 처리하는 데 있어 POSIX를 준수하지 않습니다..

비지박스의 경우 find,find . -size -12G ~이다와 유사 find . -size "-$(( 12 * GiB ))c"하며 find . -size -10이 아닌 0에서 511 사이의 크기에 사용됩니다.

장난감 상자find(예를 들어 Android에서 볼 수 있듯이) find그런 점에서 busybox처럼 동작합니다.POSIX와 호환되지 않음). 또 다른 차이점은 접미사는 대소문자를 구분하지 않으며 TPE테비바이트의 경우 페비바이트 및 엑비바이트도 지원되며 d(십진수) 추가 접미사를 사용하여 단위가 1024가 아닌 1000의 거듭제곱임을 지정할 수 있다는 것입니다. 예를 들어 -size 1kd정확히 1000인 파일을 찾습니다. 의 경우 1024바이트(1킬로바이트) 대신 바이트(1킬로바이트)를 사용합니다 -size 1k.

toybox에서 find접미사 처리는 atolx()에만 사용되는 것이 아닌 기능 의 일부로 수행됩니다 find. 그러나 이는 16진수를 지원하므로 16진수에서도 0xffff충돌이 발생합니다 . 0x2바이트 미만이 아닌 0x2c(44) 512바이트 단위 미만입니다. 그리고 또 다른 POSIX 비준수인 (8진수) 로 처리됩니다 .cbedCBED-size -0x2c-size 010c-size 8c

FreeBSD/드래곤플라이 BSD find지원 ckMGTP( 아님 bwE)이지만 접미사 없이 POSIX에서 요구하는 대로 작동하지만 find접미사²가 있는 경우 GNU가 아닌 비지박스/장난감 상자처럼 작동합니다.

sfind또는 Bosh 쉘의 내장은 접미사가 대소 문자를 구분하지 않고 지원되며 8진수/10진수 및 일부를 find제외하고 FreeBSD처럼 동작합니다.bwE제품 산술 표현식(예 6x12x8k:)이 허용됩니다.

내가 아는 한, 모든 것들은오픈BSD,NetBSD,일루모스,솔라리스,AIX,HP/UX512바이트 단위 또는 cPOSIX에서 요구하는 바이트에 대해서만 접미사 없음을 지원합니다.

요약 테이블:

전통적/POSIX 암소 비슷한 일종의 영양 FreeBSD 찾다 비지박스 장난감 상자
접미사 cwbkMG ckMGTP cwbkmgtpeCWBKMGTPE cwbk cwbkmgtpeCWBKMGTPE (+d)
숫자 형식 소수 소수 소수 12월/10월/16진수/expr 소수 12월/10월/16진수
-size $n ($n-1)*512+1 .. $n*512 ($n-1)*512+1 .. $n*512 ($n-1)*512+1 .. $n*512 ($n-1)*512+1 .. $n*512 $n*512 $n*512
-size -$n 0 .. ($n-1)*512 0 .. ($n-1)*512 0 .. ($n-1)*512 0 .. ($n-1)*512 0 .. $n*512-1 0 .. $n*512-1
-size +$n ($n*512)+1 .. ($n*512)+1 .. ($n*512)+1 .. ($n*512)+1 .. ($n*512)+1 .. ($n*512)+1 ..
-size ${n}c $n $n $n $n $n $n
-size -${n}c 0 .. $n-1 0 .. $n-1 0 .. $n-1 0 .. $n-1 0 .. $n-1 0 .. $n-1
-size +${n}c $n+1 .. $n+1 .. $n+1 .. $n+1 .. $n+1 .. $n+1 ..
-size $n$unit 해당 없음 ($n-1)*$단위+1 .. $n*$단위 $n*$단위 $n*$단위 $n*$단위 $n*$단위
-size -$n$unit 해당 없음 0 .. ($n-1)*$단위 0 .. $n*$단위-1 0 .. $n*$단위-1 0 .. $n*$단위-1 0 .. $n*$단위-1
-size +$n$unit 해당 없음 $n*$단위+1 .. $n*$단위+1 .. $n*$단위+1 .. $n*$단위+1 .. $n*$단위+1 ..

즉, 이식성을 위해 가장 좋은 방법은 c앞에 0이 없는 소수만 접미사를 사용하고 단위를 수동으로 계산하는 것입니다.

완전성을 위해 Lglob 한정자 zsh( kmgt대소문자를 구분하지 않지만 pP페비바이트가 아닌 512바이트 단위임)는 POSIX/GNU find( *(LM-12)예를 들어 크기가 0에서 11메비바이트 사이인 파일로 확장됨)처럼 작동합니다.


¹ 이는 비정규 파일에 대한 의미가 시스템마다 다를 수 있는 st_size반환된 구조의 속성 에 보고된 크기입니다 .lstat()

find² FreeBSD 에는 동일한 종류의 구별이 있습니다 . 예를 들어 2일 이상 된 파일(86400*2 - )에 일치하는 반면 하루 이상 된 파일(86400.000000001 - )에 대해서는 일치하는 조건자 sfind에 대해 동일한 종류의 구별이 있습니다. ). GNU의 경우 (또는 또는 ) 도 참조하세요 .-Xtime-mtime +1-mtime +1dfind! -newermt -1day1 day agoyesterday

답변3

Stephen Kitt가 언급한 내용에 추가하려면 gnu find를 주의하세요.반올림비교하기 전에 크기를 지정된 세분성으로 조정하세요!

만약 당신이

truncate --size=1000 dummy_file_1000
truncate --size=1024 dummy_file_1024

그 다음에

find . -size 1k 
find . -size 1024c

~ 할 것이다~ 아니다같은 결과를 줘!

보다find 명령: -size 동작

간단히 말해서 - find . -size 1k크기가 ∈[1,1024]인 모든 파일을 나열하지만 find . -size 1024c실제 크기가 정확히 1024바이트인 파일만 나열합니다.

관련 정보