특정 크기 범위의 파일 삭제


12

크기가 특정 값 사이 인 파일을 삭제하고 싶습니다. 예를 들어 다음과 같은 파일 목록이 있습니다.

-rw-r--r-- 1 smsc sys  558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys  388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys  386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys  389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys  390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys  385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z

위의 목록에서 386b390b 사이의 크기가 다른 파일 만 삭제 하고 싶습니다 . 다음 명령을 사용하여 특정 크기를 초과하는 파일을 삭제할 수 있음을 알고 있습니다 <size>.

find . -size +<size>-delete

그러나 크기가 주어진 값보다 작은 파일에 대해 하나 이상의 경계를 추가하려면 어떻게해야합니까?


4
find조건은 기본적으로 논리적으로 AND되어 있으므로 -size다른 범위에 대한 다른 옵션을 사용하십시오.
jw013

@ jw013 위대한! 그것은 나를 위해 작동합니다. 감사! 답변으로 게시 해 주시면 동의하겠습니다.
유진 S

답변:


7

범위는 단순히 상한 하한입니다. 로부터 find사양 :

표현 [-a] 표현

1 차 연결; AND 연산자는 두 개의 1 차 병렬 처리에 의해 내포되거나 선택적 -a 연산자에 의해 명시됩니다. 첫 번째 표현이 거짓이면 두 번째 표현은 평가되지 않습니다.

따라서 -delete조치 전에 두 크기 한계를 지정하기 만하면됩니다.


8

-a명시 적으로 AND두 개의 경선을 결합하다 할 수 있습니다 연산자. 이 경우을 사용하여 범위를 -size만듭니다.

find . -size +386b -a -size -390b -exec rm -f {} \;

크기는 선택적으로 +and 앞에 추가 할 수있는 숫자 인수입니다 -. 보낸 사람 man 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.

답변 주셔서 감사합니다. 그러나 @ jw013이 그의 의견에서 언급했듯이 find조건은 기본적으로 논리적으로 AND됩니다. 그래서 방금 size조건을 하나 더 추가 했는데 정상적으로 작동했습니다! 최종 명령은 다음과 같습니다.find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S

7

find숫자를 기대할 때 마다이 숫자 +보다 큰 -부호를 나타내거나이 숫자보다 작은 부호를 붙일 수 있습니다. 이러한 엄격한 불평등 있습니다 +3-7수단 (4), 5 또는 6.

-size기본을 사용하면 c숫자가 바이트 수임을 나타내는 접미사를 추가해야 합니다. 여러 기본을 연결하여 연결을 수행 할 수 있습니다 (일부 버전에서는 기본 간 -a또는 -and사이에 둘 수 있음). 그러므로:

find . -size +385c -size -391c -delete

zsh에서는 L glob 한정자를 사용할 수 있습니다 . 기본 단위는 바이트입니다. 와 같이 find문자 +-엄격한 불평등을 나타냅니다.

rm *(L+385-391)

(위의 명령은 하위 디렉토리로 재귀되지 않습니다. 필요한 경우 **/패턴 앞에 추가 하십시오.)


+3과 -7이 4, 5 또는 6과 같은 것을 이해하지 못합니다. 설명해 주시겠습니까?
Hashim

1

한 가지 방법으로 perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *

답변 주셔서 감사합니다! 이 코드 부분을 한 줄로 입력해야합니까?
유진 S

@ 유진 : 예. 명령 줄에 그대로 붙여 넣거나 모든 줄을 하나로 결합해야합니다.
Birei
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.