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?


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.


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.

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).


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 $_: $!] 
        } 
    }
' *

¡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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.