He aquí un ejemplo script bash:
#!/bin/bash
local LOCKFILE=/tmp/rmHugeNumberOfFiles.lock
# this process gets ultra-low priority
ionice -c2 -n7 -p $$ > /dev/null
if [ $? ]; then
echo "Could not set disk IO priority. Exiting..."
exit
fi
renice +19 -p $$ > /dev/null
if [ $? ]; then
echo "Could not renice process. Exiting..."
exit
fi
# check if there's an instance running already. If so--exit
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
echo "An instance of this script is already running."
exit
fi
# make sure the lockfile is removed when we exit. Then: claim the lock
trap "command rm -f -- $LOCKFILE; exit" INT TERM EXIT
echo $$ > $LOCKFILE
# also create a tempfile, and make sure that's removed too upon exit
tmp=$(tempfile) || exit
trap "command rm -f -- '$tmp'" INT TERM EXIT
# ----------------------------------------
# option 1
# ----------------------------------------
# find your specific files
find "$1" -type f [INSERT SPECIFIC SEARCH PATTERN HERE] > "$tmp"
cat $tmp | rm
# ----------------------------------------
# option 2
# ----------------------------------------
command rm -r "$1"
# remove the lockfile, tempfile
command rm -f -- "$tmp" $LOCKFILE
Este script comienza estableciendo su propio proceso de prioridad y prioridad de diskIO a valores muy bajos, para garantizar que otros procesos en ejecución no se vean afectados lo más posible.
Luego se asegura de que sea ÚNICAMENTE el proceso en ejecución.
El núcleo de la secuencia de comandos depende de su preferencia. Puede usar rm -r
si está seguro de que todo el directorio puede eliminarse indebidamente (opción 2) o puede usar find
para eliminar archivos más específicos (opción 1, posiblemente utilizando las opciones de línea de comando "$ 2" y onw. Para mayor comodidad).
En la realización anterior, la opción 1 (find
) primera salida a todo a un archivo temporal, por lo que la función rm
sólo se le llama una vez en lugar de después de cada archivo encontrado por find
. Cuando la cantidad de archivos es enorme, esto puede representar un ahorro de tiempo considerable. A la baja, el tamaño del archivo temporal puede convertirse en un problema, pero esto solo es probable si está borrando literalmente miles de millones de archivos, además, porque el disco tiene una prioridad tan baja, usando un archivo temporal seguido de un solo rm
puede en total sea más lento que usando la opción find (...) -exec rm {} \;
. Como siempre, debe experimentar un poco para ver qué se adapta mejor a sus necesidades.
EDITAR: Según lo sugerido por el usuario946850, también puede omitir todo el archivo de temp y usar find (...) -print0 | xargs -0 rm
. Esto tiene una huella de memoria más grande, ya que todas las rutas completas a todos los archivos coincidentes se insertarán en la RAM hasta que el comando find
haya finalizado por completo. Por el lado positivo: no hay archivos adicionales IO debido a las escrituras en el archivo temporal. Cuál elegir depende de su caso de uso.
Lo que debe ser rápido, creando espacio o eliminando el directorio.Si el segundo, 'mv' it (muy rápido), luego elimínelo. –