Excluir arquivos de determinado tamanho

12

Eu quero excluir arquivos cujo tamanho está entre certos valores. Por exemplo, 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 posso usar o seguinte comando para excluir arquivos cujo tamanho excede certos <size>:

find . -size +<size>-delete

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

Eugene S
fonte
4
findas condições são logicamente AND 'por padrão, portanto, basta escolher outra -sizeopção para o outro limite.
Jw013
@ jw013 Ótimo! Isso funciona para mim. Obrigado! Por favor, publique como sua resposta e eu aceito.
Eugene S

Respostas:

7

Um intervalo é simplesmente um limite superior E um limite inferior. Das findespecificações :

expressão [-a] expressão

Conjunção de primárias; o operador AND é implícito pela justaposição de duas primárias ou tornado explícito pelo operador -a opcional. A segunda expressão não deve ser avaliada se a primeira expressão for falsa.

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

jw013
fonte
8

O operador -aexplícito ANDque permite combinar duas primárias. Nesse 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 opcionalmente ser anexado 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.
George M
fonte
Obrigado pela sua resposta. No entanto, como @ jw013 mencionado em seu comentário, as findcondições são AND logicamente por padrão. Acabei de adicionar mais uma sizecondição e funcionou bem! O comando final se parece com:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S
7

Sempre que findespera um número, você pode colocar um +sinal antes que ele signifique mais que esse número ou um -sinal que signifique menos que esse número. São desigualdades estritas: +3e -7significa 4, 5 ou 6.

Com o -sizeprimário, você precisa adicionar o sufixo cpara indicar que o número é um número de bytes. Você pode concatenar várias primárias para fazer a conjunção (em algumas versões, é possível colocar -aou -andentre elas). Portanto:

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

No 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 recursa em subdiretórios; se você precisar, adicione **/antes do padrão.)

Gilles 'SO- parar de ser mau'
fonte
Eu não entendo os +3 e -7 iguais a 4, 5 ou 6. Você poderia explicar?
Hashim
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 $_: $!] 
        } 
    }
' *
Birei
fonte
Obrigado pela sua resposta! Essa parte do código deve ser inserida como uma única linha?
Eugene S
@EugeneS: Sim. Deve funcionar colando-o na sua linha de comando como está ou unindo todas as linhas em uma.
Birei