Presentiamo ora una semplice applicazione che permette la ricerca e il rilevamento di files duplicati all’interno del file system.

Con gli hard disk moderni sempre più vicini alle grandezze dei mass-storage capita frequentemente di perdere il controllo dell’organizzazione dei files presenti nel sistema e ritrovarsi con più di una copia dello stesso file.

L’applicazione DupFinder è basata sul codice scritto da George Shearer nel suo FindDupe v1.3.

Questo programma tenta di trovare files duplicati nell’albero delle directory specificate (tramite riga di comando).

Il funzionamento è semplice, prima classifica i files in base alla loro dimensione, dopodiche’ esegue un un confronto byte per byte sui files di grandezza identica per vedere se sono identici.

Le funzioni di comparazione sono:

int diffs(unsigned char *s1,unsigned char *s2,int x) {
   while(x-- && (unsigned char)*s1++==(unsigned char)*s2++);
   return(!(x<1&&(unsigned char)*(s1-1)==(unsigned char)*(s2-1)));
}

int diff(char *file1,char *file2) {
   int fd1=-1,fd2=-1,sr1,sr2,ret=0;
   unsigned char buf1[1024],buf2[1024];

   if(((fd1=open(file1,O_RDONLY))==-1)||((fd2=open(file2,O_RDONLY))==-1)) {
     fprintf(stderr,"Unable to compare %s & %s.\n",file1,file2);
     ret++;
   }
   else
     while(1) {
       if(((sr1=read(fd1,(unsigned char *)buf1,1024))==-1)||((sr2=read(fd2,(unsigned char *)buf2,1024))==-1)) {
         fprintf(stderr,"Read error: %s\n",(sr1==-1) ? buf1 : buf2);
         break;
       }
       if(sr1==0 && sr2==0) {
         ret=0;
         break;
       }
       if(diffs((unsigned char *)buf1,(unsigned char *)buf2,sr1)) {
         ret=1;
         break;
       }
     }
   if(fd1!=-1)
     close(fd1);
   if(fd2!=-1)
     close(fd2);
   return(ret);
}

Il programma ha diversi livelli di verbosità, controllati dall’opzione -v:

  • nessuna = solo statistica
  • -v = visualizza il numero di file caricati per ogni directory
  • -vv = visualizza il percorso dei files duplicati.
  • -vvv = identico a -vv ma con output compatibile per il parsing da script
  • -vvvv = visualizza anche i files di stesse dimensioni ma differenti
  • -vvvvv = aggiunge i files di dimensione 0
  • -vvvvvv = Ulteriori messaggi di debug

E’ possibile inoltre specificare la grandezza minima dei files da processare tramite l’opzione -min

NOTA: E’ possibile che DupFinder riporti più files duplicati del numero dei files confrontati. Ogni file e’ confrontato con gli altri presenti nella lista, per questo e’ possibile che un file possa essere considerato duplicato di più di un altro file della lista. Questo si verifica per esempio in caso vengono trovate 3 o più copie dello stesso file

Dupfinder ignora gli hard e i symbolic links.

Seguono una serie di esempi d’uso del programma

% dupfinder
Usage: dupfinder [-v[v[v[v[v]]]]] [-h] [-min [minsize]] path [path ...]
Where: path is the location of tree to search for duplicate files.
% dupfinder /tmp
1 possible duplicate out of 53 files.
% dupfinder -v /tmp
Scanning /tmp                ...loaded 53 files.
1 possible duplicate out of 53 files.
% dupfinder -v /tmp /usr/man
Scanning /tmp                ...loaded 53 files.
Scanning /usr/man            ...loaded 579 files.
2 possible duplicates out of 632 files.
% dupfinder -vv /tmp
Scanning /tmp                ...loaded 53 files.

Source pathname             Target pathname               Status    Byte size
-----------------------------------------------------------------------------
/tmp/gcc/inc-4.4.1.tar.gz   /tmp/gcc/copy_of_inc.tar.gz (identical) (137388)

1 possible duplicate out of 53 files.
% dupfinder -vvvv /tmp
Scanning /tmp                ...loaded 53 files.

Source pathname             Target pathname               Status    Byte size
-----------------------------------------------------------------------------
/tmp/msdos/disk1_raw.zip    /tmp/msdos/disk3_raw.zip    (different) (1459284)
/tmp/gcc/inc-4.4.1.tar.gz   /tmp/gcc/copy_of_inc.tar.gz (identical) (137388)

1 possible duplicate out of 53 files.
% dupfinder -vvvv -min 1000000 /tmp
Scanning /tmp                ...loaded 53 files.

Source pathname             Target pathname               Status    Byte size
-----------------------------------------------------------------------------
/tmp/msdos/disk1_raw.zip    /tmp/msdos/disk3_raw.zip    (different) (1459284)

0 possible duplicate out of 53 files.
Allegati