찾기 명령: -size 동작

찾기 명령: -size 동작

findLinux의 명령에 관해 질문이 있습니다 .

온라인에서 찾은 모든 기사에는 -size -10M속성이 크기가 10MB보다 작은 파일을 반환한다고 언급되어 있습니다. 그런데 이것을 테스트해 보니 -size -10M반환되는 파일 크기가 9MB 이하인 것 같습니다.

만약 내가한다면

find . -type f -size -1M

find명령은 빈 파일만 반환합니다(단위는 관련이 없으며 -1G, -1k...일 수 있음).

find . -type f -size -2M

크기가 1M 미만인 파일을 반환합니다.

매뉴얼 페이지에는 다음과 같이 나와 있습니다.

치수는 다음 단위로 반올림됩니다. 따라서 -size -1M은 -size -1048576c와 동일하지 않습니다. 전자는 빈 파일만 일치하고 후자는 0에서 1,048,575바이트까지의 파일과 일치합니다.

좋아요, 그러면 -1M은 0M로 반올림되고, -2M은 -1M으로 반올림되는 것 같군요...?

그러나 이후에

find . -type f -size 1M

<= 1M(예: 100K 및 512K 파일, 빈 파일은 아님) 파일을 반환하지만 정확히 1M 크기의 파일을 반환하고 싶습니다.

find . -type f -size 2M

> 1M 및 <= 2M 등의 파일을 반환합니다.

이것이 정상입니까, 아니면 제가 뭔가 잘못하고 있는 것입니까? 매개변수의 정확한 동작은 무엇입니까 -size?

답변1

GNU find 매뉴얼 페이지는 다음과 같습니다. 이는 GNU find에만 해당되는 것으로 보이며 다른 구현은 다를 수 있습니다. 아래를 참조하세요.

평소와 같이 + 및 - 접두사는 보다 큼과 보다 작음을 나타냅니다. 즉, n 단위의 정확한 크기가 일치하지 않습니다. 치수는 다음 단위로 반올림됩니다. 따라서 -size -1M동일하지 않습니다 -size -1048576c. 전자는 빈 파일만 일치하고 후자는 0~1,048,575바이트의 파일과 일치합니다.

질문:

좋아요, 그러면 -1M은 0M로 반올림되고, -2M은 -1M으로 반올림되는 것 같군요...?

-size아니요. 반올림 조건은 제한이 아니라 파일 크기 자체입니다.

1234바이트 파일과 -size -1M명령을 가져옵니다. 파일 크기는 지침에 언급된 가장 가까운 단위(여기서는 MB)로 반올림됩니다. 1234B -> 1MB. -size -1M요건을 충족하지 못하기 때문에 적합하지 않습니다.미만1MB(반올림). 따라서 실제로는 빈 파일만 반환됩니다.-size -1xx

역시 -size 1M위 파일은 반올림 후 크기가 정확히 1MB이기 때문에 일치합니다. (크기가 1B에서 1048576B인 모든 파일과 일치합니다.) 반면에 -size 1k1234B는 2kB로 반올림되므로 일치하는 항목이 없습니다.

조건에서 숫자 앞 -이나 뒤는 +반올림 동작과 아무 관련이 없습니다.

반올림 문제가 발생하지 않도록 항상 크기를 바이트 단위로 지정하는 것이 유용할 수 있습니다. -size -$((1024*1024))c크기가 1MB(또는 원하는 경우 1MiB) 미만인 파일을 안정적으로 찾습니다. 예를 들어 범위를 원하는 경우 ( -size +$((512*1024-1))c -size -$((1024*1024+1))c )[512kB, 1024kB] 내의 파일을 사용할 수 있습니다.

이에 대한 또 다른 질문은 다음과 같습니다."find -size -1G"가 파일을 찾지 못하는 이유는 무엇입니까?


관련 질문에서 언급된 Gilles사실은POSIX는 다음과 같이 지정합니다. -size Nas 는 512바이트 블록 단위의 크기를 나타냅니다(위와 같이 반올림됨: "파일 크기(바이트 단위), 512로 나누고 다음 정수로 반올림됨"). as 는 크기(바이트 단위)를 나타냅니다. 둘 다 선택적인 더하기 또는 빼기 기호와 함께 제공됩니다. 다른 것들은 지정되지 않았으며 모든 구현이 다른 접두사를 인식하지 않거나 GNU find처럼 반올림을 수행하지 않습니다.-size Ncfind

Mac에서 Busybox 및 *BSD find로 테스트한 결과 더 합리적으로 느껴지는 방식으로 크기 지정자를 사용하여 조건을 처리하는 것 같습니다. 즉, -size -1k0에서 1023바이트까지의 파일 일치, 와 동일 -size -1024c, -size -1M== 또한 유사함 -size -1024k(Busybox만 해당) c, b그리고 k). 그런 다음 POSIX 텍스트에서 말하는 것과는 달리 Busybox는 블록에 지정된 크기에 대해서도 반올림되지 않는 것 같습니다.

따라서 YMMV도 크기를 바이트 단위로 유지하는 것이 더 나을 수도 있습니다.


-atime-mtime및 조건에도 비슷한 문제가 있습니다 -ctime.

-atime n
파일은 n*24시간 전에 마지막으로 액세스되었습니다. find가 24시간 전에 파일에 마지막으로 액세스한 기간을 계산할 때 소수 부분은 무시됩니다. 따라서 일치하려면 -atime +1파일에 최소한 액세스한 적이 있어야 합니다.며칠 전.

마찬가지로, -amin +$((24*60-1))이 기능을 사용하여 최소 24시간 전에 마지막으로 액세스한 파일을 찾는 것이 더 쉬울 수도 있습니다. (1분으로 늘리면 벗어날 수 없습니다.)

또한보십시오:find -mtime +1이 2일 전의 파일만 반환하는 이유는 무엇입니까?


이게 정상인가요, 아니면 제가 뭔가 잘못하고 있는 건가요? -size 매개변수의 정확한 동작은 무엇입니까?

이는 GNU find의 동작 측면에서 "정상"이지만 완전히 합리적이라고는 할 수 없습니다. 혼란스러운 것이 잘못된 것이 아니라 find혼란스러운 것뿐입니다.

답변2

find매뉴얼 섹션에 대한 답변 -size:

평소와 같이 + 및 - 접두사는 보다 큼과 보다 작음을 의미합니다. 즉, n 단위의 정확한 크기가 일치하지 않습니다. 기억해 주세요,크기는 다음 단위로 반올림됩니다.. 그래서 - 크기 - 1M-size -1048576c와 동일하지 않습니다. 이전의빈 파일만 일치, 후자는 0에서 1,048,575바이트까지의 파일과 일치합니다.

따라서 언급된 모든 경우에는 질문이 있습니다.크기 매개변수와 비교하기 전에 크기를 가장 가까운 단위로 반올림합니다.. -size단위가 "M"인 경우에는 모두 메가바이트로 반올림됩니다.

관련 정보