Excluir arquivos de determinado intervalo de tamanho

11

Eu quero excluir arquivos cujo tamanho está entre determinados valores. Por exemplo, eu tenho a seguinte lista de arquivos:

-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

Na lista acima, desejo excluir apenas os arquivos cujo tamanho varia entre 386b e 390b . Eu sei que eu posso usar o seguinte comando para excluir arquivos cujo tamanho excede o certo <size> :

find . -size +<size>-delete

Mas como posso adicionar mais um limite para arquivos cujo tamanho é menor que um determinado valor?

    
por Eugene S 30.04.2012 / 16:56

4 respostas

6

Um intervalo é simplesmente um limite superior AND um limite inferior. Das find spec :

expression [-a] expression

Conjunction of primaries; the AND operator is implied by the juxtaposition of two primaries or made explicit by the optional -a operator. The second expression shall not be evaluated if the first expression is false.

Portanto, tudo o que você precisa fazer é especificar os dois limites de tamanho antes da ação -delete .

    
por 30.04.2012 / 17:54
7

O -a em um operador AND explícito que permite reunir duas primárias. Neste caso, criando um intervalo usando -size .

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

Observe que o tamanho é um argumento numérico que pode ser incluído opcionalmente com + e - . De man 1 find :

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.
    
por 30.04.2012 / 17:12
6

Sempre que find espera um número, você pode colocar um sinal + antes para significar mais do que esse número ou um sinal - para significar menos que esse número. Essas são desigualdades estritas: +3 e -7 significa 4, 5 ou 6.

Com o -size primary, você precisa adicionar o sufixo c para indicar que o número é um número de bytes. Você pode concatenar várias primárias para obter sua conjunção (em algumas versões, você pode colocar -a ou -and entre elas). Assim:

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

Em zsh, você pode usar o L qualificador glob . A unidade padrão é bytes; como find , os caracteres + e - indicam desigualdades estritas.

rm *(L+385-391)

(O comando acima não recorre a subdiretórios; se precisar, adicione **/ antes do padrão.)

    
por 01.05.2012 / 03:00
1

Uma maneira de usar perl :

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

Tags