Pregunta

¿Existe una forma más rápida de eliminar un directorio que simplemente enviarlo?

rm -r -f *directory*

?Pregunto esto porque nuestras compilaciones multiplataforma diarias son realmente enormes (p. ej.4 GB por compilación).Por eso, los discos duros de algunas máquinas se quedan frecuentemente sin espacio.

Éste es el caso de nuestras plataformas AIX y Solaris.

¿Quizás haya comandos "especiales" para eliminar directorios en estas plataformas?

PEGAR-EDITAR (moví mi propia respuesta separada a la pregunta):

Generalmente me pregunto por qué 'rm -r -f' es tan lento.No 'rm' sólo necesita modificar los archivos '..' o '.' para des-asignar las entradas del sistema de archivos.

algo como

mv *directory* /dev/null

sería bueno.

¿Fue útil?

Solución

Para borrar un directorio desde un sistema de archivos, rm es su opción más rápida. En Linux, a veces hacemos nuestra construye (pocos GB) en un disco de memoria, y tiene una velocidad de eliminación realmente impresionante :) También puede probar diferentes sistemas de archivos, pero en AIX / Solaris es posible que no tienen muchas opciones ...

Si su objetivo es tener el directorio $ dir vacío ahora , puede cambiarle el nombre, y eliminarlo después de un trabajo de fondo / cron:

mv "$dir" "$dir.old"
mkdir "$dir"
# later
rm -r -f "$dir.old"

Otro truco es que se crea un sistema de archivos separado para $ dir, y cuando se quiere eliminarla, sólo basta con volver a crear el sistema de ficheros. Algo como esto:

# initialization
mkfs.something /dev/device
mount /dev/device "$dir"


# when you want to delete it:
umount "$dir"
# re-init
mkfs.something /dev/device
mount /dev/device "$dir"

Otros consejos

He olvidado la fuente de este truco, pero funciona:

EMPTYDIR=$(mktemp -d)
rsync -r --delete $EMPTYDIR/ dir_to_be_emptied/

En AIX, al menos, usted debe utilizar LVM, el administrador de volúmenes lógicos. Todos nuestros sistemas lían todo el disco duro físico en un único grupo de volúmenes y luego crear un sistema de archivos honkin' grande fuera de eso.

De esta manera, se puede añadir dispositivos físicos a su máquina a voluntad y aumentar el tamaño de su sistema de archivos para lo que necesite.

Otra solución que he visto es asignar un directorio de basura en cada sistema de archivos y el uso de una combinación de mv y un trabajo find cron para abordar el problema de espacio.

Básicamente, tiene un trabajo cron que sale cada diez minutos y ejecuta:

rm -rf /trash/*
rm -rf /filesys1/trash/*
rm -rf /filesys2/trash/*

Entonces, cuando usted quiere que su directorio específico de ese sistema de archivos reciclado, uso algo como:

mv /filesys1/overnight /filesys1/trash/overnight

y, dentro de los próximos diez minutos su espacio de disco comenzará a ser recuperado. El directorio filesys1/overnight estará inmediatamente disponible para su uso, incluso antes de la versión papelera ha empezado a ser eliminado.

Es importante que el directorio de la basura sea en el mismo sistema de archivos como el directorio que desea quitarse de encima, de lo contrario usted tiene una copia masiva / operación de eliminación en sus manos en lugar de un movimiento relativamente rápido.

Si rm -rf es lento, tal vez usted está utilizando una opción de "sincronización" o similar, que está escribiendo en el disco con demasiada frecuencia. En Linux ext3 con las opciones normales, rm -rf es muy rápido.

Una de las opciones para la eliminación rápida que funcionaría en Linux y presumiblemente también en varios Unices es utilizar un dispositivo de bucle, algo como:

hole temp.img $[5*1024*1024*1024]  # create a 5Gb "hole" file
mkfs.ext3 temp.img
mkdir -p mnt-temp
sudo mount temp.img mnt-temp -o loop

El programa "agujero" es uno que escribí yo mismo para crear un archivo vacío de gran tamaño utilizando un "agujero" en lugar de bloques asignados en el disco, que es mucho más rápido y no utiliza ningún espacio en el disco hasta que realmente lo necesita. http://sam.nipl.net/coding/c-examples/hole. c

Me acabo de dar cuenta que GNU coreutils contiene un programa similar "truncado", por lo que si usted tiene que se puede utilizar esto para crear la imagen:

truncate --size=$[5*1024*1024*1024] temp.img

Ahora usted puede utilizar la imagen montada bajo mnt-temporal para el almacenamiento temporal, para su acumulación. Cuando haya terminado con él, hacer esto para eliminarlo:

sudo umount mnt-temp
rm test.img
rmdir mnt-temp

Creo que usted encontrará que la eliminación de un solo archivo grande es mucho más rápido que la eliminación de un montón de pequeños archivos!

Si no le importa para compilar mi programa "hole.c", puede utilizar dd, pero esto es mucho más lento:

dd if=/dev/zero of=temp.img bs=1024 count=$[5*1024*1024]  # create a 5Gb allocated file

rm -r directory obras de manera recursiva hasta primero en profundidad a través de directorio , la eliminación de archivos, y borrar los directorios en el camino de vuelta. Tiene que, ya que no se puede eliminar un directorio que no está vacío.

Long, aburrido detalles:. Cada objeto del sistema de archivos está representado por un inodo en el sistema de archivos, que tiene el archivo de todo el sistema, una matriz plana de nodos [1] Si usted acaba de eliminar directorio sin antes borrar sus hijos, entonces quedarían asignados a los niños, pero sin ningún tipo de punteros a ellos. (Cheques fsck para ese tipo de cosas cuando se ejecuta, ya que representa el daño del sistema de archivos.)

[1] que pueden no ser estrictamente cierto para cada sistema de archivos por ahí, y puede haber un sistema de archivos que funciona de la manera que usted describe. Sería posiblemente requerirá algo así como un recolector de basura. Sin embargo, todos los comunes que saben de acto como fs objetos son propiedad de i-nodos y directorios son listas de pares de nombre / número de nodo-i.

Creo que en realidad no es otra cosa que "rm-rf", como usted ha citado a borrar sus directorios.

para evitar hacerlo manualmente una y otra vez que puede cron diaria un guión que recurrentemente se eliminan todos los directorios de construcción de su directorio raíz de construcción si son "suficientemente mayor" con algo como:

find <buildRootDir>/* -prune -mtime +4 -exec rm -rf {} \;

(aquí -mtime 4 indica "cualquier archivo de más de 4 días)

Otra forma sería la de configurar su constructor (si se permite que tales cosas) para aplastar la acumulación previa con la actual.

Me estaba investigando esto también.

Yo tenía un directorio con más de 600.000 archivos.

rm * fracasaría, porque hay demasiadas entradas.

find . -exec rm {} \; era agradable y eliminar ~ 750 archivos cada 5 segundos. Estaba comprobando la tasa de RM a través de otro shell.

Así que, en lugar de eso escribió un guión corto a rm muchos archivos a la vez. Los cuales obtuvieron aproximadamente 1000 ~ archivos cada 5 segundos. La idea es poner tantos archivos en 1 comando rm como sea posible para aumentar la eficiencia.

#!/usr/bin/ksh
string="";
count=0;
for i in $(cat filelist);do
    string="$string $i";
    count=$(($count + 1));
  if [[ $count -eq 40 ]];then
    count=1;
    rm $string
    string="";
  fi
done

Uso perl -e 'para (<*>) {((stat) [9] <(unlink))}' Por favor, consulte a continuación enlace: http://www.slashroot.in /

, que el método más rápido-a-delete-archivos-en-linux-is-

En Solaris, esta es la manera más rápida que he encontrado.

find /dir/to/clean -type f|xargs rm

Si tiene archivos con rutas impares, el uso

find /dir/to/clean -type f|while read line; do echo "$line";done|xargs rm 

he tenido que eliminar más de 3.00.000 archivos en Windows. Había instalado cygwin. Por suerte tenía todo el directorio principal en una base de datos. Creado un bucle y en base a la entrada de línea y eliminar el uso de rm-rf

Se necesita eliminar 700 Gbytes de docenas de directorios en AWS EBS 1 TB de disco (ext3) antes de copiar resto a un nuevo volumen de 200 Gbytes XFS. Se estaba tomando horas dejando que el volumen al 100% wa. Desde el disco IO y hora del servidor no son libres, esto tuvo sólo una fracción de segundo por directorio.

donde / dev / sdb es un volumen vacío de cualquier tamaño

directory_to_delete = / EBS / var / tmp /

mount / dev / sdb $ directory_to_delete

nohup rsync -avh / EBS / / ebs2 /

Codifiqué una pequeña aplicación Java RdPro (herramienta de purga de directorio recursiva) que es más rápida que rm.También puede eliminar los directorios de destino especificados por el usuario bajo una raíz. Funciona tanto para Linux/Unix como para Windows.Tiene una versión de línea de comandos y una versión GUI.

https://github.com/mhisoft/rdpro

Yo sólo tiene que utilizar find ./ -delete en la carpeta de vaciar, y se ha borrado 620000 directorios (tamaño total) de 100 GB en cerca de 10 minutos.

Fuente: un comentario en este sitio https://www.slashroot.in/ comentario / 1286 # comment-1286

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top