Eliminar archivos de cierto rango de tamaño

12

Quiero eliminar archivos cuyo tamaño está entre ciertos valores. Por ejemplo, tengo la siguiente lista de archivos:

-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

De la lista anterior, quiero eliminar solo los archivos cuyo tamaño varía entre 386b y 390b . Sé que puedo usar el siguiente comando para eliminar archivos cuyo tamaño excede cierto <size>:

find . -size +<size>-delete

Pero, ¿cómo puedo agregar un límite más para archivos cuyo tamaño es menor que un valor dado?

Eugene S
fuente
44
findlas condiciones son lógicamente AND 'por defecto, así que simplemente agregue otra -sizeopción para el otro límite.
jw013
@ jw013 ¡Genial! Funciona para mi. ¡Gracias! Publíquelo como su respuesta y lo aceptaré.
Eugene S

Respuestas:

7

Un rango es simplemente un límite superior Y un límite inferior. De la findespecificación :

expresión [-a] expresión

Conjunción de primarias; el operador AND está implícito en la yuxtaposición de dos primarios o se hace explícito en el operador opcional -a. La segunda expresión no se evaluará si la primera expresión es falsa.

Entonces, todo lo que necesita hacer es especificar ambos límites de tamaño antes de la -deleteacción.

jw013
fuente
8

El -aen un ANDoperador explícito que le permite unir dos primarias. En este caso, crear un rango usando -size.

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

Tenga en cuenta que el tamaño es un argumento numérico que opcionalmente puede anteponerse con +y -. 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
fuente
Gracias por su respuesta. Sin embargo, como @ jw013 mencionó en su comentario, las findcondiciones son lógicamente AND'd por defecto. ¡Así que acabo de agregar una sizecondición más y funcionó bien! El comando final se ve así:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S
7

Siempre que findespere un número, puede poner un +signo antes de que signifique más que este número, o un -signo que signifique menos que este número. Estas son desigualdades estrictas: +3y -7significa 4, 5 o 6.

Con el -sizeprimario, debe agregar el sufijo cpara indicar que el número es un número de bytes. Puede concatenar varias primarias para tomar su conjunción (en algunas versiones, puede ponerlas -ao -andentre ellas). Así:

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

En zsh, puede usar el L calificador glob . La unidad predeterminada es bytes; como find, los caracteres +e -indican estrictas desigualdades.

rm *(L+385-391)

(El comando anterior no se repite en subdirectorios; si lo necesita, agregue **/antes del patrón).

Gilles 'SO- deja de ser malvado'
fuente
No entiendo que +3 y -7 equivalen a 4, 5 o 6. ¿Podría explicar?
Hashim
1

Una forma de usar perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *
Birei
fuente
¡Gracias por su respuesta! ¿Debería ingresarse esta parte del código como una sola línea?
Eugene S
@ EugeneS: Sí. Debería funcionar pegándolo en su línea de comando tal cual o uniendo todas las líneas en una.
Birei