Eliminar archivos de forma recursiva cuyo tamaño es inferior a 1 MB

Respuestas:

21

Esto se puede hacer con find:

find . -type f -size -1M -exec rm {} +

Tenga en cuenta que esto descenderá recursivamente a subdirectorios y eliminará incondicionalmente todos los archivos de menos de 1 megabyte. Ten cuidado.

Sven Marnach
fuente
te estás perdiendo el argumento del camino haciafind
@ Inútil: Eso es GNU find. :)
Sven Marnach
2
@DanielAndersson: findrestringe el número de argumentos para que el proceso llamado se ajuste a los límites del sistema, en contraste con lo rm *que se garantiza que es una invocación de un solo proceso. findinvocará varias instancias de rmsi es necesario. Y estoy bastante seguro de que los caracteres especiales se tratan correctamente, incluidos los caracteres de nueva línea. Yo prefiero -exec rmmás -deletepor razones de flexibilidad - como ejemplo, que el segundo ofrece ninguna manera de borrar archivos protegidos contra escritura.
Sven Marnach
1
@Invoker: Revertí su cambio ya que era incorrecto. -1Msignifica menos de un megabyte como se desee. Su versión eliminaría todos los archivos con exactamente un megabyte de tamaño, lo que parece ser una operación algo inútil.
Sven Marnach
2
Para cualquier persona interesada, si desea eliminar todos los archivos mayores de 1M, use el comando find . -type f -size +1M -exec rm {} +. Tenga en cuenta el + 1M en lugar de -1M.
chessofnerd
10

Esto debería hacer el trabajo:

$ find <directory> -type f -size -1M -delete
jcollado
fuente
No creo que necesitemos un guión de 1M.
Invoker
2
@Invoker, creo que el -signo es un signo menos que significa "menos de 1M". Si ejecuta find <directory> -type f -size +1M -delete, eliminará todos los archivos de más de 1M.
chessofnerd
sí, tienes razón, mi mal
Invoker
2

Solo por variedad y una posible ganancia de rendimiento (probablemente marginal):

find <directory> -type f -size -1M -print0  | xargs -0 rm
Inútil
fuente
¿Cómo se supone que esto sea más rápido? Comienza un xargsproceso adicional .
Sven Marnach
¡Ahora puede tener dos CPU compitiendo por el mismo dispositivo de bloque! Más sensiblemente, las operaciones stat / readdir no están bloqueadas sincrónicamente por la operación de desvinculación. Si es probable que esto sea mejor obviamente depende del tamaño del subárbol, el número de archivos, el dispositivo, etc.
1

Tratar

encontrar . -size -1M -exec rm {} \;

ahvargas
fuente
1
Esto es genial para usuarios que no son GNU. ¡Gracias! lo mismo que la respuesta de @ Sven, pero con \;al final en lugar de+
hamx0r
-1

Puede consultar este enlace http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , tiene exactamente lo que desea.

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

Puede recorrer todos los archivos con un bucle for y luego usar du y awk para encontrar el tamaño de archivo como en el ejemplo anterior.

Steen Schütt
fuente
Las respuestas sobre SO deben ser independientes, no publique un simple enlace. (Además, el código en la publicación vinculada elimina archivos vacíos en lugar de archivos menores de 1M.)
Sven Marnach
@SvenMarnach no podemos usar $ file_size <1M en el enlace de ejemplo de código dado.
No, no podemos, ya que el caparazón no lo entenderá 1M.
Sven Marnach
Por 1M quise decir 1048576 convertir 1MB a byte
1
Bueno, si prueba si esto realmente funciona y copia el código a su respuesta, esto podría convertirse en una respuesta SO.
Sven Marnach