Una restauración de archivos rarita

Y es que las copias de seguridad de un Windows 10 son especiales y me ha costado un rato conseguir archivos antiguos.

Antecedentes

El jueves pasado me comunican que el ordenador del almacén se ha muerto y no encuentra el disco para arrancar. Cuando llego el viernes me encuentro con que es así y que tengo que llevármelo para ver con más calma que le pasa. Es uno de esos equipos que compraron a traición con el Windows 10 de marras para emplear sólo el navegador y acceder al ERP por lo que pienso que tengo una gran oportunidad.

Una oportunidad de reinstaurar poco a poco las máquinas Linux y quitarnos de encima esas basuras de diseño que son los Windows 10, y lo hago con cierto temor de que me pongan pegas o incluso peor, me comuniquen que increíblemente los operarios del almacén gestionan hojas de cálculo Excel pata negra para alguna cosa indispensable, y no me quede otra que envainármela y recuperar un sistema de Microsoft. Pero ha salido bien. Algo precario pero bien.

Así que me lo llevo a casa y el domingo compruebo con un adaptador externo que el disco, un Toshiba de 500Gb mecánico, está más para allá que para acá. Engancha irregularmente y cuando lo hace parece que la mayor parte de sus directorios están vacíos. Y no me lo pienso, claro. Aprovecho que me quedo con todos los discos antiguos para colocarle un SSD de 120Gb e instalarle sin más Debian 11. Y como un maldito tiro que va el muchacho.

El lunes llevo la máquina e intento instalarle uno de los paquetes que yo tenía para instalar y configurar los programas que le permiten acceder a la red: LDAP para las cuentas de usuarios, autofs para acceder a archivos compartidos y personales y detalles así. No funciona del todo bien porque desde que me retiraron el control de la mayor parte de estas máquinas no lo he mantenido actualizado y dos versiones mayores de Debian implican cambios en algunos detalles. No me rindo y los ajusto a mano y lo dejo niquelado. Más o menos. Bueno, sí, bastante bien. Tiene el problema de que se sigue conectando por Wifi empleando un adaptador USB que se lleva regular con la suspensión del sistema. Pero eso también ha tenido solución al final.

Pues al rato de tenerlo en marcha aparece el encargado de poner pedidos internacionales a decirme que sus archivos no aparecen y que los necesita. Y resulta que sí que los necesita, no es la famosa excusa de algunos. Son documentos con las direcciones de clientes que tiene que modificar ligeramente e imprimir en etiquetas A4 para pegar en los palets. Estaban en una carpeta del escritorio y eso no se lo he restaurado. Pues vaya. Razón tiene. Había una copia completamente desactualizada en el árbol de archivos compartidos pero la que él empleaba era la de ese ordenador.

Hace un tiempo que tenía organizada la copia de seguridad de los sistemas Windows empleando para ello el mecanismo propio del sistema. Lo llaman concretamente backups de Windows 7 y funciona aunque reconozco que nunca he llegado a entenderla del todo. Sé que hay como dos partes: en una le indicamos qué carpetas guardar y la otra (la que suele desbordarme la máquina de backups) salva una especie de imagen del sistema. Se activa con una simple marca en un formulario y no tengo mucho más control sobre lo que salva. Es la primera la que me podía servir.

Me conecto al ordenador de copias secundario, al que llamé cofre acertadamente y que es una máquina muy antigua con bastante espacio en disco y que sirve de espejo del servidor de copias principal, y busco los directorios donde las máquinas Windows dejan sus copias. Por cada máquina hay un directorio y dentro del él la siguiente estructura de directorios y archivos:

ALMACEN/
└── Backup Set 2021-05-05 120002
    ├── Backup Files 2021-05-05 120002
    │   └── Catalogs
    ├── Backup Files 2021-05-12 120003
    │   └── Catalogs
    ├── Backup Files 2021-05-19 120001
    │   └── Catalogs
    ├── Backup Files 2021-05-26 120001
    │   └── Catalogs
    ├── Backup Files 2021-06-02 120002
    │   └── Catalogs
    ├── Backup Files 2021-06-09 120001
    │   └── Catalogs
    ├── Backup Files 2021-06-16 120005
    │   └── Catalogs
    ├── Backup Files 2021-06-23 120001
    │   └── Catalogs
    ├── Backup Files 2021-06-30 120001
    │   └── Catalogs
    ├── Backup Files 2021-07-07 120003
    │   └── Catalogs
    ├── Backup Files 2021-07-14 120002
    │   └── Catalogs
    ├── Backup Files 2021-09-29 120003
    │   └── Catalogs
    ├── Backup Files 2021-10-06 120002
    │   └── Catalogs
    ├── Backup Files 2021-10-13 120002
    │   └── Catalogs
    └── Catalogs

Y dentro de cada una de ellas algo parecido a:

│   ├── Backup Files 2021-10-13 120002
│   │   ├── Backup files 1.zip
│   │   ├── Backup files 2.zip
│   │   └── Catalogs
│   │       ├── Backup files 1.wbcat
│   │       ├── Backup files 1.wbverify
│   │       ├── Backup files 2.wbcat
│   │       └── Backup files 2.wbverify

En el directorio Catalogs están guardados archivos con extensión .wbcat y .wbverify que son un formato privado de Microsoft y parece que sólo pueden gestionarse con un programa concreto. Y eso suponía un problema para mí, en ese momento y en el futuro, porque iba a necesitar Windows para obtener archivos simples de sus copias. Y me fijé entonces en los archivos .zip. Me habían pasado totalmente desapercibidos y resulta que el formato era justo lo que estaba buscando. O no. O sólo un poco.

Los datos salvados y cómo me disparo en el pie

Los archivos zip contienen correctamente almacenados las carpetas y su contenido y se podían haber extraído sin más copiándolos a otra máquina (la mía concretamente) y extrayéndolos allí. Pero no, como estaba viendo muchísimos archivos que tenían que ver con aplicaciones del sistema operativo, cachés y demás morralla se me ocurre usar el programa mc para ello y entro directamente en los directorios primero y en los zip después.

Usando mc para explorar el directorio

Entro directamente en cada uno de los archivos zip para explorarlos y termino encontrando los documentos que quería:

El interior del archivo zip según el programa mc.

Así que en el otro panel abro una conexión sftp con mi máquina y, ni corto ni perezoso, marco y copio directamente los archivos desde el interior del zip a mi directorio de trabajos temporales:

Y esto es lo que obtengo directamente. Un grupo de archivos cuyo nombre está formado por todas las carpetas que componen su ruta pero sin ninguna carpeta creada.

C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALBARANES DE ENTREGA.sxw
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\BRINKMANN.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\BRUGGEMANN.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\ERREBI.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\EURO-LEDER.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\GEORG EMRICH BULMUS.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\GOTZ.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\HAUEISEN.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\KLASSEN.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\LANG.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\MULLER.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\PICARD.sxw.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\TRAUMWANDLER.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ALEMANIA\ZENTRALVERBAND.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ARGELIA\AMEUR NASREDDINE.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ARGENTINA\CASA NUBAR.sxw
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\ARGENTINA\EDGARDO JAVIER GOMEZ.sxw
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\AUSTRALIA\BROOKS (VICTORIA).odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\AUSTRALIA\BROOKS.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\AUSTRALIA\KWIKSMART.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\AUSTRIA\HEINZ HERFORT.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\BELGICA\ABDELLAH M BEN.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\BELGICA\AFT INTERNATIONAL.sxw
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\BELGICA\CASTILLO VALERE.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\BELGICA\COLMAN.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\BELGICA\DASSI.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\BELGICA\DEDECQ.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\BELGICA\GOVAERE.odt
C\Users\HP-7010\Desktop\SERGIO\ALBARANES ENTREGA\BELGICA\GUIOT DANIEL.odt

¡ Demonios ! ¿ Y ahora qué hago ? Porque son unos cuantos centenares de ellos repartidos en varias docenas de carpetas. Sin pensármelo siquiera creo y aplico una solución.

La recuperación

He escrito un pequeño script para crear la estructura de carpetas, sanear los nombres y copiar los archivos a sus destinos finales:


#!/usr/bin/perl

use Modern::Perl;
use utf8;

use File::Copy;
use Text::Unaccent; 

while (my $orig = <STDIN>) {
    chomp $orig;
    my $file = $orig;
    $file =~ s/C\\Users\\HP-7010\\Desktop\\//g;

    next if $file !~ m/SERGIO/;

    my @parts = split(m/\\/, $file); 
    my $total = scalar(@parts);

    my $num = 1;
    my $dir = '';
    foreach my $part (@parts) {
        $part = ucfirst lc $part;
        if ($num == $total) {
            my $last = unac_string('UTF8', $part);
            say $last; 
            
            say "Copiando $orig en $dir";
            copy( $orig, "${dir}/${last}" ) or die "fallo en copia $!";   

            last;
        }

        $dir .= $part . '/';
        $num++;

        $dir = unac_string('UTF8', $dir);

        mkdir $dir if not -d $dir;
    }    

}

Y para llamarlo empleo algo tan directo como:

$ ls -1 C\\* | perl sergio.pl 

El resultado

Pues muy chulo. Pero no va a durar. Si en casi tres décadas no he conseguido que dejen de escribir en mayúsculas y con o sin acentos no voy a lograrlo ahora.

$ tree Sergio/
Sergio/
├── Albaranes entrega
│   ├── Albaranes de entrega.sxw
│   ├── Alemania
│   │   ├── Brinkmann.sxw.odt
│   │   ├── Bruggemann.sxw.odt
│   │   ├── Errebi.sxw.odt
│   │   ├── Euro-leder.sxw.odt
│   │   ├── Georg emrich bulmus.odt
│   │   ├── Gotz.sxw.odt
│   │   ├── Haueisen.sxw.odt
│   │   ├── Klassen.sxw.odt
│   │   ├── Lang.sxw.odt
│   │   ├── Muller.sxw.odt
│   │   ├── Picard.sxw.odt
│   │   ├── Traumwandler.odt
│   │   └── Zentralverband.odt
│   ├── Argelia
│   │   └── Ameur nasreddine.odt
│   ├── Argentina
│   │   ├── Casa nubar.sxw
│   │   └── Edgardo javier gomez.sxw
│   ├── Australia
│   │   ├── Brooks (victoria).odt
│   │   ├── Brooks.odt
│   │   └── Kwiksmart.odt
│   ├── Austria
│   │   └── Heinz herfort.odt
│   ├── Belgica
│   │   ├── Abdellah m ben.odt
│   │   ├── Aft international.sxw
│   │   ├── Castillo valere.odt

En realidad lo anterior me llevó poco y disfruté haciéndolo pero ya hemos visto que no tenía ninguna necesidad de hacerlo. Sí, fue rápido y audaz, entrando en un sistema mediante ssh, abriendo archivos zip con un visor y copiándolos a otra máquina (de la que partí) con toda comodidad. Algo sobre lo que escribir, desde luego. Pero innecesario de haberme parado a pensar y realizar alguna que otra prueba más.

En fin, al menos he aprendido cómo funcionan más o menos las dichosas copias. Cada juego de copias de Windows comienza por una carpeta llamada Backup Set fecha y cifra y dentro de ella hay otras supongo que por cada copia incremental llamada Backup Files fecha y cifra (coinciden fecha y cifra con la carpeta contenedora) con archivos zip con los contenidos y una carpeta llamada Catalogs con meta datos de las copias.