El título está basado en un hecho real, aunque casi casi el truco que pondré a continuación está limitado a archivos de texto, ya que podemos identificar fácilmente su contenido. Si me apuráis, valdría con cualquier tipo de archivo, pero los archivos binarios, raramente podemos saber con exactitud qué contienen.
Me encontraba yo preparando una entrada de datos para base de datos, fue un archivo que me llevó un tiempo donde hacía numerosas consultas, y llega la hora de hacer la consulta, de estas veces que puede que por el cansancio, por tener un día un poco tonto, por no pulsar bien una tecla, o un lapsus, en lugar de:
$ mysql -uroot -pMICLAVE < consultas.sql
se me ocurre escribir:
$ mysql -uroot -pMICLAVE > consultas.sql
vamos, que el archivo con el que llevaba ya un rato se borró por completo, y yo me encontraba como la foto de portada.
Pero bueno, eso no era más que un reto más, podíamos intentar recuperar el contenido, ya que cuando borramos un archivo así, con rm, o incluso después de un formateo, los datos siguen ahí, sólo están catalogados como espacio libre; por eso, tenemos que tener cuidado de no escribir nada en disco mientras no se recupera la información.
En la actualidad hay aplicaciones como photorec (la cual me ha salvado la vida innumerables veces), pero necesitan de mucho tiempo y recuperan todo lo recuperable, luego hace falta tirarse mucho tiempo explorando los archivos recuperados para ver cuál me interesaba.
Pero esta vez, había prisa, al principio intenté:
$ sudo less -f /dev/sda4
Mi problema estaba en la partición /dev/sda4 . El modificador -f es para abrir ficheros que no son normales, como un dispositivo, como es el caso. Aunque hubo otro problema más adelante, less se comía toda la memoria RAM del ordenador, y no llegué a recorrer por completo el disco, por lo que no logré recuperar la información.
Tras eso, hice una prueba, un poco más elegante y un tanto más rebuscada, la siguiente:
$ grep -a -A100 -B100 -i ‘SELECT `elemento` FROM `Tabla`’ /dev/sda4 > /tmp/recuperados.txt
Adelantar que sí tuve éxito de esta forma, vamos a comentar un poco cada argumento:
- -a : Nos permite buscar dentro de ficheros binarios, en este caso es un dispositivo, pero su información no es de texto siempre.
- -A100 : Cuando encuentre lo que buscamos, cogerá el texto desde 100 filas antes.
- -B100 : Cuando encuentre lo que buscamos, cogerá el texto hasta 100 filas después.
- -i : No diferencia mayúsculas de minúsculas
- ‘SELECT `elemento` FROM `Tabla`’ este es el texto que queremos buscar, entre comillas simples, si es corto, lo más seguro que encontremos muchas coincidencias, y luego tendremos muchos contenidos, eso sí, debe ser preciso, exactamente igual que lo que está escrito en el archivo
- /dev/sda4 : El dispositivo donde buscamos.
- /tmp/recuperados.txt : El archivo donde vamos a escribirlo, deberá ser en un dispositivo diferente a donde estamos buscando
Tras unos 20 minutos, tenía un archivo recuperados.txt con un montón de datos, y más o menos con un vistazo desde un editor de texto logré extraer la información que había perdido.
Si me permites un consejo, te recomiendo poner en el .bashrc la siguiente linea:
set -o noclobber
De esta manera, bash no te dejará redirigir la salida de un comando hacia un fichero que ya existe a no ser que uses >>. Para que te deje tendrías que escribir el comando así:
mysql -uroot -pMICLAVE > consultas.sql
Una medida muy útil. Échale un vistazo a esto: http://www.cyberciti.biz/tips/howto-keep-file-safe-from-overwriting.html
Un saludo.
Muy buen consejo, desconocía ese modificador. Muchas gracias!
Pingback: Bitacoras.com /
Pingback: BITes: Ray Tomlinson, Skype se rompe, seguridad, SSD de 15Tb!! ordenadores en ciencia ficción, eliminar de forma segura – Poesía Binaria /