sábado, 22 de diciembre de 2012

Encontrando archivos duplicados con la Shell

Bueno, hablo de parte de las personas que conozco, pero al parecer los programadores de python detestan a Ruby. En vista esto, decidí hacer una entrada acerca de la entrada anterior, pero ahora, usando herramientas del sistema.

Utilizando La Orden Find Y Perl
Modo de invocación
find . -type f -exec sha1sum '{}' \; | perl script.pl
Fichero auxiliar, guárdese como script.pl, asegúrate de pasar la la dirección absoluta de este archivo a Perl.
use strict;

my %hsh = ();
while(<STDIN>) {
        /^([a-f0-9]+)\s+(.+)$/;
        print "$2\n";
        if( not $hsh{$1}) {
                @{$hsh{$1}} = ($2);
        } else {
                push @{$hsh{$1}}, $2
        }
}

print "\n\nDuplicates!\n\n";
for(keys %hsh) {
        next if(@{$hsh{$_}}==1); 
        print(join("\n  -> ", @{$hsh{$_}}));
        print "\n";
}
Utilizando La Orden Find Y AWK
Modo de invocacion
find . -type f -exec sha1sum '{}' \; | awk -f script.awk
Fichero auxiliar, guárdese como script.awk, asegúrate de pasar la la dirección absoluta de este archivo a AWK.
{
        path = substr($0, 41)
        print path
        if(!array[$1]) {
                array[$1]= path
                next
        }

        array[$1] = (array[$1] "\n  ->" path)
        duplicates[$1] = 1
}

END {
        if(!length(duplicates))
                exit

        print "\n\nDuplicates!\n\n"
        for(key in duplicates)
                print array[key] "\n\n"
}
Script Para Bash
Bueno, realmente considero que es un poco más práctico tener un script al que podamos invocar con argumentos, para esto seria conveniente incluir dentro de el  script de Bash el script para Perl, y con la opción -e pasar a Perl el programa como una cadena en vez de un fichero.  Por  motivos de brevedad, estaré utilizando la forma que he venido utilizando en toda la entrada.
#!/bin/bash

# By default, the current working directory is used.
DIR=$PWD

if [[ -n $1 ]]; then
        DIR=$1
fi
find $DIR -type f -exec sha1sum '{}' \; | perl script.pl

No hay comentarios:

Publicar un comentario