27 sept 2012

Eliminar archivos por numero de Inodo o archivos sin nombre

Primero que nada voy a hacer una breve reseña de que es y como surgio este post.

Resulta que anteayer, luego de eliminar mi Firefox por completo, el OpenJDK y bajar el Firefox nuevo 17 beta, me vi obligado a instalar flash y java para el mismo.


Entre errores, tutos mal armados, finalmente encontre uno que indicaba donde guarda la info sobre eso Fedora, si, aca no es apt-get install java y salio, fue al estilo Slackware, distro que siempre me gusto por tener que hacer todo de 0.
Cuestion que en uno de mis intentos, erré a un enlace simbolico, y quedo algo como si hacen esto, los invito a probar:

ln -s /dev/null " "

El resultado, es un link simbolico, que no se puede borrar dado que su nombre es nulo, aca el tema del post.

Para mi novedad, el comando rm de GNU, no tiene ninguna opcion de borrar el archivo por inodo, porque digo esto?.
Que es un inodo?, wikipedia:

"En informática, un inodo, nodo-i o nodo índice es una estructura de datos propia de los sistemas de archivos tradicionalmente empleados en los sistemas operativos tipo UNIX como es el caso de Linux. Un inodo contiene las características (permisos, fechas, ubicación, pero NO el nombre) de un archivo regular, directorio, o cualquier otro objeto que pueda contener el sistema de ficheros."

En realidad, cuando uno borra un archivo con rm, borra el inodo, no el archivo en si, lo sabran eso por como recuperar archivos borrados usando el comado lsof, a traves del inodo.
Cuestion, que hay una forma, muy rebuscada para mi gusto, y poco facil de recordar, para eliminar un archivo por su inodo cuando pasa esto, que el nombre no existe, o bien el caracter es raro, o lo que sea.
Entonces, me decidi a armar un script, que comparto con la comunidad, para que lo usen si lo necesitan, o tengan un comando mas.

Basicamente, si les pasa esto, hacen un:

ls -li

Y eso, les lista los archivos presentes en un directorio, mostrando el numero de inodo, es el numero de la izquierda de todo, la idea es, si les pasa algo asi, ejecutan ls -li, y llaman a este script, llamado "RMI", donde les va a preguntar el numero de inodo y procede a borrarlo, util no?.

Para los que son mas vagos o menos experimentados, armé un .tar donde contiene el script + instalador, solo deben hacer

tar xvf rmi.tar
chmod +x rmi_install.sh
sh rmi_install.sh

Link de Descarga del tarball: RMI-TOOL
Script:

#!/bin/sh
# RMI: A command line tool to remove files by inode number
# Author: SynFlag
# License: GPLv2
#########################################################

if [ -n "$1" ]; then

    lsi=$(ls -li | awk '{print $1}' | grep -w "$1")

    if [ "$lsi" = "$1" ]; then

        find . -inum $1 -exec rm -f {} \; > /dev/null 2>&1
        lsi=$(ls -li | awk '{print $1}' | grep -w "$1")  
          
                if [ -z "$lsi" ]; then
                    echo "Inodo $1 borrado exitosamente"
                    unset lsi
              
                else
              
                    echo "No se pudo borrar el Inodo $1"
                  
                fi
    else

        echo "El número de Inodo ingresado no existe en este directorio"
        unset lsi
  
    fi

else

    echo "Debe ingresar un número de Inodo, ejecute ls -li para ver los de este directorio"

fi

exit 0

Bueno, asi como está, lo salvan en /usr/local/bin con el nombre rmi, no es necesario especificar que es un script poniendo .sh, le dan permisos de ejecucion con chmod +x rmi y listo.

Modo de uso:

rmi N, donde N es el número de inodo

No hay comentarios: