Header Ads

Find and Destroy

Existen infinidades de archivos que pueden considerarse basura. Para Windows hay múltiples herramientas que se ocupan de lidiar con este asunto y mantener nuestro PC lo más limpio posible, tales como CCleaner, Glary, y un largo etc. En Linux también hay aplicaciones poderosas como Bleachbit, que purgan la basura y de paso corrigen los errores. Sin embargo mucho de los procesos que realizan estos programas no son del todo claros y a veces causan más problemas de los que resuelven.
Este asunto puede tornarse gris, si hablamos de servidores Linux, con mucha carga de trabajo, generando miles de temporales, archivos en la cache, etc, que pueden saturarlo en cuestión de horas, pero que hay que saber lo que se está haciendo porque podemos dejar a mucha gente sin servicio.
Supongamos que tenemos nuestro flamante servidor Linux, superconfigurado hasta el más mínimo detalle, pero con discos externos conectados (montados en carpetas) con partición NTFS (para mayor compatibilidad con Windows) y lo tenemos compartido con varios terminales que constantemente mueven información. Adicionalmente correos aplicaciones en el servidor y en la partición NTFS que generan temporales, que al cerrarse a veces no se eliminan ocupando espacio, y usuarios que trabajan simultáneamente en archivos que también dejan rastros de basura y también las propias aplicaciones del servidor. Para completar los metadatos ADS están por doquier, y al pasar archivos entre las particiones NTFS y de Linux (Ext2, Ext3, etc), se generan estos archivos misteriosos llamados :encryptable, Zone.identifier, goutputstream, Thumbs.db, etc, y al intentar copiar una carpeta con datos de un lugar a otro, que contenga archivos ADS (Zone.identifier) se bloquea la copia y genera error.
Estos archivos los crea Windows (como un identificador de zona a través de un nombre de stream) para utilizarlo, por ejemplo, en mensajes de advertencia en caso de ejecución. pero, según  Kriptopolis y  Ecured, generan más mal que bien y en ocasiones representan un peligro, ya que ADS se puede utilizar para ocultar datos.
La suite Sysinternals ofrece un pack para eliminarlos (Ver Tutorial), pero para linux la cosa se complica. Para estos casos el mantenimiento de software debe ser programable, desatendido y con un nivel de efectividad quirúrgico. Afortunadamente el comando Find puede realizar este trabajo, siempre que sepamos qué es lo que exactamente hay que "Buscar y Eliminar".
A continuación hemos desarrollado un script para Linux, que puede mantener su equipo libre de basura y metadatos.
En la sección entre paréntesis puede colocar los archivos que quiera que el comando Find busque y destruya
(:encryptable|Zone\.identifier|goutputstream|Thumbs\.db)
Puede elegir “find .” y el punto indicará que buscará en todo el disco duro, incluyendo las carpetas donde se montaron las particiones NTFS y con el comando mv las moverá a donde desee. En el ejemplo mueve lo encontrado a la papelera de reciclaje (para Ubuntu 12.04. Cambie la línea en dependencia de su distro). Esto es para que pueda verificar lo que movió antes de decidir eliminarlo definitivamente.
mv -f {} ~/.local/share/Trash/files \;
Este script puede colocarlo en init.d y programarlo en el cron para que se ejecute en un horario de poca congestión en su red o poco uso de su PC o servidor. Si no lo quiere programar y desea ejecutarlo manualmente póngalo en home y ejecute
./findanddestroy.sh
También hay una serie de ejemplos que puede usar el que quiera y adaptarlo a sus necesidades con solo descomentarlo.
Es importante resaltar que como el script hace una busqueda recursiva por todo el/los discos, también lo hará en la carpeta Trash (Pepelera de Reciclaje) y como los archivos encontrados se están moviendo a esa carpeta en tiempo real, saldrá un mensaje de archivo duplicado, como se muestra en la imagen, pero no afecta al script ni a su sistema.
Este no es el único uso del script. Puede buscar, mover, eliminar o copiar multiples archivos y carpetas, por extensiones, referencias u otras maneras de busqueda, ideal para manipular masivamente archivos y directorios (tenga en cuenta los permisos)
Script Find and Destroy
#!/bin/bash

# checking script execution
if pidof -x $(basename $0) > /dev/null; then
  for p in $(pidof -x $(basename $0)); do
    if [ $p -ne $$ ]; then
      echo "Script $0 is already running..."
      exit
    fi
  done
fi

# Crear el script
# cd $HOME && touch nombredelscript.sh && chmod +x nombredelscrip.sh
# Nomenclatura
# Comando find se le indica la ruta de búsqueda
# (.) representa al directorio actual, pero puede ser cualquiera.
# Opcion -type f para buscar archivos
# Opción -name (“”) va el nombre del archivo a buscar. Se admiten expresiones regulares, como (*) 
# Opcion -exec rm -f {} \; para eliminar archivos
# Opcion -exec mv -f {} \; para mover archivos
# Ejemplos Prácticos
# Buscar y eliminar archivos con el comando find
# find . -type f -name "ARCHIVO-A-BUSCAR"-exec rm -f {} \;
# Buscar y eliminar archivos y directorios con el comando find
# find . -name "ARCHIVO-A-BUSCAR" -exec rm -rf {} \;
# Buscar archivos Thumbs.db en el directorio actual (.) y eliminarlos
# find . -type f -name "Thumbs.db" -exec rm -f {} \;
# Buscar archivos core en el sistema (/) y eliminarlos:
# find / -name core -exec rm -f {} \;
# Buscar archivos .bak en el directorio actual (.) y eliminarlos solicitando confirmación:
# find . -type f -name "*.bak" -exec rm -i {} \;
# Eliminar todos los archivos y conservar .mp3:
# find . ! -name "*.mp3" -exec rm -f {} \;
# Buscar archivos con extensión .xxx y copiarlos a otra carpeta.
# find /home/User/Carpeta/ -regextype posix-egrep -regex '^.*\.(png|jpg)$' -exec cp {} /Destino/ \;
# Buscar archivos con extensión .xxx y moverlos a otra carpeta.
# find /home/User/Carpeta/ -regextype posix-egrep -regex '^.*\.(png|jpg)$' -exec mv {} /Destino/ \;
# Mover archivos mp3 y mp4 masivamente de una carpeta a otra.
# find /home/usuario/compartida/ -regextype posix-egrep -regex '^.*\.(mp4|mp3)$' -exec mv {} /home/usuario/musica/ \;
# Mover archivos.ext de un lugar a otro
# find directorio_origen -type f -name *.EXT -exec mv {} ./directorio_destino \;
# Para mover (o copiar, cambiar mv por cp):
# find /Directorio/ -iname "juno*" | xargs -i mv {}/Dirección donde se quiere mover/
# Para borrar
# find /Directorio -iname "archivo"-exec rm {} \;
# find / -iname "nombredelarchivo*" | xargs -i mv {} /destino
# find /ruta -iname "*referencia*" -type f -exec mv /destino {} \;
# Buscar y mover de forma recursiva
# find _origindir_ -type f -name ”_pattern_” -exec mv -v {} _outputdir_ ;
# Buscar y eliminar archivos ADS (Thumbs.db, Zone.identifier, encryptable, etc), entre otros
#find . -type f -name "Nombre_del_Archivo" -exec rm {} \;
find . -type f -regextype posix-egrep -iregex "^.*(:encryptable|Zone\.identifier|.fuse_hidden*|goutputstream*|.spotlight-*|.fseventsd*|.ds_store*|~lock.*|Thumbs\.db|attributes:).*$" -exec rm {} \; &> /dev/null
# Eliminar reportes antiguos de apport
rm -rf /var/crash/*crash &> /dev/null
# eliminar llenado kern/syslog
#cat /dev/null > /var/log/kern.log
#cat /dev/null > /var/log/syslog
echo "Done"
Con la tecnología de Blogger.