Tenemos un problema con una carpeta que se vuelve difícil de manejar con cientos de miles de archivos pequeños.
Hay tantos archivos que el rendimiento rm -rf
devuelve un error y, en cambio, lo que debemos hacer es algo como:
find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;
Esto funciona pero es muy lento y falla constantemente por quedarse sin memoria.
¿Hay una mejor manera de hacer esto? Idealmente, me gustaría eliminar todo el directorio sin preocuparme por el contenido que contiene.
linux
command-line
files
rm
Toby
fuente
fuente
rm -rf *
en la carpeta probablemente falla debido a demasiados argumentos; pero, ¿qué pasarm -rf folder/
si quieres eliminar todo el directorio de todos modos?rm -rf
?fsck
para recuperar los bloques de disco no utilizados, pero ese enfoque parece arriesgado y puede que no sea más rápido. Además, la verificación del sistema de archivos puede implicar atravesar recursivamente el árbol del sistema de archivos de todos modos.ccache
árbol de archivos tan grande, y merm
tomó tanto tiempo (y haciendo que todo el sistema se volviera lento), fue considerablemente más rápido copiar todos los demás archivos del sistema de archivos, formatearlos y copiarlos de nuevo. Desde entonces, le doy a estos enormes árboles de archivos pequeños su propio sistema de archivos dedicado, para que puedamkfs
hacerlo directamente en lugar de hacerlorm
.Respuestas:
Usar rsync es sorprendentemente rápido y simple.
La respuesta de @ sarath mencionó otra opción rápida: ¡Perl! Sus puntos de referencia son más rápidos que
rsync -a --delete
.Fuentes:
fuente
rsync
puede ser más rápido que simplerm
, ya que garantiza las eliminaciones en el orden correcto, por lo que se necesita menos recálculo de btress. Ver esta respuesta serverfault.com/a/328305/105902-P
opción a rsync para una visualización más, también, tenga cuidado con la sintaxis, las barras diagonales son obligatorias. Finalmente, puede iniciar el comando rsync por primera vez con la-n
opción primero de iniciar una ejecución en seco .-a
igual-rlptgoD
, pero solo para borrar-rd
es necesarioAlguien en Twitter sugirió usar en
-delete
lugar de-exec rm -f{} \;
Esto ha mejorado la eficiencia del comando, aunque todavía usa la recursividad para pasar por todo.
fuente
find
tiene-delete
, yfind
tal vez otros .-delete
siempre se debe preferir a-exec rm
cuando esté disponible, por razones de seguridad y eficiencia.¿Qué pasa con algo como:
find /path/to/folder -name "filenamestart*" -type f -print0 | xargs -0rn 20 rm -f
Puede limitar el número de archivos para eliminar a la vez cambiando el argumento para el parámetro
-n
. También se incluyen los nombres de archivo con espacios en blanco.fuente
-n 20
bit, ya que xargs debería limitarse a tamaños aceptables de listas de argumentos de todos modos.man xargs
:(...) max-chars characters per command line (...). The largest allowed value is system-dependent, and is calculated as the argument length limit for exec
. Entonces, la-n
opción es para aquellos casos en los que xargs no puede determinar el tamaño del búfer de la CLI o si el comando ejecutado tiene algunos límites.Ampliando uno de los comentarios, no creo que estés haciendo lo que crees que estás haciendo.
Primero creé una gran cantidad de archivos, para simular su situación:
Luego probé lo que esperaba que fallara, y lo que parece que estás haciendo en la pregunta:
Pero esto hace el trabajo:
fuente
rm -Rf bigdirectory
varias veces. Tenía un directorio con miles de millones de subdirectorios y archivos. Ni siquiera podía correrls
ofind
orsync
en ese directorio, ya que se quedó sin memoria. El comando serm -Rf
cerró muchas veces (sin memoria) solo eliminando parte de los miles de millones de archivos. Pero después de muchos intentos, finalmente hizo el trabajo. Parece ser la única solución si el problema es quedarse sin memoria.Un truco inteligente:
Es súper intensivo en CPU, pero realmente muy rápido. Ver https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html
fuente
rsync -a --delete
vs 43 paralsdent
. La relación 10x fue paratime ls -1 | wc -l
vstime ./dentls bigfolder >out.txt
(que es una comparación parcialmente justa debido a> file
vswc -l
).Tuve la oportunidad de probar
-delete
en comparación con-exec rm \{\} \;
y para mí-delete
fue la respuesta a este problema.El uso
-delete
eliminó los archivos en una carpeta de 400,000 archivos al menos 1,000 veces más rápido querm
.El artículo 'Cómo eliminar una gran cantidad de archivos en Linux' sugiere que es aproximadamente tres veces más rápido, pero en mi prueba la diferencia fue mucho más dramática.
fuente
find -exec
ejecuta elrm
comando para cada archivo por separado, por eso es tan lento.Acerca de la
-delete
opción anterior: la estoy usando para eliminar una gran cantidad (1M + est) de archivos en una carpeta temporal que creé y, sin querer, olvidé limpiar todas las noches. Llené mi disco / partición accidentalmente, y nada más podría eliminarlos excepto elfind .
comando. Es lento, al principio estaba usando:Pero eso estaba tomando una cantidad EXTREMA de tiempo. Comenzó después de unos 15 minutos para eliminar algunos de los archivos, pero supongo que estaba eliminando menos de 10 por segundo después de que finalmente comenzó. Entonces, probé el:
en cambio, y lo dejo correr ahora mismo. Parece que se está ejecutando más rápido, aunque es EXTREMADAMENTE gravar en la CPU que el otro comando no. Se ha estado ejecutando durante aproximadamente una hora y creo que estoy recuperando espacio en mi disco y la partición gradualmente se "adelgaza", pero todavía está tomando mucho tiempo. Dudo seriamente que funcione 1,000 veces más rápido que el otro. Como en todas las cosas, solo quería señalar la compensación en el espacio frente al tiempo. Si tiene el ancho de banda de la CPU de sobra (lo hacemos), ejecute el último. Tiene mi CPU funcionando (
uptime
informes):Y he visto que el promedio de carga supera los 30.00, lo que no es bueno para un sistema ocupado, pero para el nuestro, que normalmente está ligeramente cargado, está bien durante un par de horas. He revisado la mayoría de las otras cosas en el sistema y todavía responden, así que estamos bien por ahora.
fuente
exec
es casi seguro que no quiere usar-ls
y dofind . -type f -exec rm '{}' +
+ es más rápido porque le dará tantos argumentos a rm como pueda manejar a la vez.find … -delete
través denice
oionice
, eso puede ayudar. Por lo tanto, podría cambiar algunas opciones de montaje a configuraciones menos seguras contra choques. (Y, por supuesto, dependiendo de qué más hay en el sistema de archivos, la forma más rápida de eliminar todo es a menudomkfs
.)1
de un solo núcleo es lo mismo que cargar64
en el sistema de 64 núcleos, lo que significa que cada CPU está ocupada el 100% del tiempo.Hay un par de métodos que se pueden usar para eliminar una gran cantidad de archivos en Linux. Puede usar la opción buscar con eliminar, que es más rápida que la opción exec. Luego puede usar perl unlink, e incluso rsync. Cómo eliminar una gran cantidad de archivos en Linux
fuente
Considere usar el volumen Btrfs y simplemente elimine todo el volumen para dicho directorio con una gran cantidad de archivos.
Alternativamente, puede crear un archivo de imagen FS y luego desmontar y eliminar su archivo para eliminar todo a la vez realmente rápido.
fuente
Suponiendo que tengo GNU
parallel
instalado, he usado esto:parallel rm -rf dir/{} ::: `ls -f dir/`
Y fue lo suficientemente rápido.
fuente
Usar en
rm -rf directory
lugar derm -rf *
.Inicialmente estábamos haciendo
rm -rf *
mientras estábamos en el directorio para borrar el contenido y pensamos que era lo más rápido posible. Pero entonces uno de nuestros ingenieros superiores sugirió que evitemos usar los asteriscos (*
) y, en su lugar, pasemos al directorio principal, comorm -rf directory
.Después de un intenso debate sobre cómo eso no haría una diferencia, decidimos compararlo, junto con un tercer método de uso
find
. Aquí están los resultados:rm -rf directory
es aproximadamente 9 VECES MÁS RÁPIDO querm -rf *
!No hace falta decir que le compramos cerveza a ese ingeniero .
Así que ahora usamos
rm -rf directory; mkdir directory
para eliminar el directorio y volver a crearlo.fuente
La eliminación de directorios REALMENTE GRANDES necesita un enfoque diferente, como aprendí de este sitio : necesitará utilizar ionice. Asegura (con -c3) que las eliminaciones solo se realizarán cuando el sistema tenga IO-time para ello. La carga de sus sistemas no se elevará a un nivel alto y todo permanece receptivo (aunque el tiempo de mi CPU para encontrar fue bastante alto, aproximadamente el 50%).
fuente
+
lugar de\;
lo haría más rápido, ya que pasa más argumentos a la rm a la vez, menos bifurcaciónionice -c3 find <dir> -type f -delete
Si tiene millones de archivos y todas las soluciones anteriores ponen su sistema en tensión, puede probar esta inspiración:
Archivo
nice_delete
:Y ahora borre los archivos:
Buscar creará lotes (ver
getconf ARG_MAX
) de unas decenas de miles de archivos y se los pasaránice_delete
. Esto creará lotes aún más pequeños para permitir dormir cuando se detecta sobrecarga.fuente
debería funcionar dentro de la carpeta principal
fuente
ls
no funcionará debido a la cantidad de archivos en la carpeta. Es por eso que tuve que usarfind
, gracias.ls -f
, que deshabilita la ordenación. La ordenación requiere que todo el directorio se cargue en la memoria para ser ordenado. Un no clasificadols
debe poder transmitir su salida.find . -print0 | xargs -0 rm
, que usarán el carácter NULL como separador de nombre de archivo.Para la pista de Izkata arriba:
Esto casi funcionó, o habría funcionado, pero tuve algunos problemas con el permiso; los archivos estaban en un servidor, pero aún no entiendo de dónde vino este problema de permiso. De todos modos, Terminal solicitó confirmación en cada archivo. La cantidad de archivos rondaba los 20 000, por lo que esta no era una opción. Después de "-r" agregué la opción "-f", por lo que todo el comando fue " rm -r -f foldername / ". Entonces pareció funcionar bien. Soy un novato con Terminal, pero supongo que esto estuvo bien, ¿verdad? ¡Gracias!
fuente
Dependiendo de qué tan bien necesita deshacerse de esos archivos, sugeriría usarlos
shred
.Si desea purgar el directorio, pero no puede eliminarlo y volver a crearlo, le sugiero moverlo y volver a crearlo al instante.
esto es más rápido, lo creas o no, ya que solo hay que cambiar un inodo. Recuerde: Realmente no puede paralelizar este sabor en una computadora multinúcleo. Todo se reduce al acceso al disco, que está limitado por el RAID o lo que tienes.
fuente
shred
no funcionará con muchos sistemas de archivos modernos.Si solo desea deshacerse de muchos archivos lo antes posible,
ls -f1 /path/to/folder/with/many/files/ | xargs rm
podría funcionar bien, pero mejor no lo ejecute en sistemas de producción porque su sistema podría convertirse en problemas de E / S y las aplicaciones podrían bloquearse durante la operación de eliminación.Este script funciona bien para muchos archivos y no debería afectar la carga del sistema.
fuente