Il faut garder une table des fichiers source déjà copiés, qui au couple (st_dev, st_ino) d’un fichier source fait correspondre le nom de son fichier destination. À chaque copie, on consulte cette table pour voir si un fichier source avec le même couple (st_dev, st_ino) a déjà été copié; si oui, on fait un lien dur vers le fichier destination, au lieu de refaire la copie. Pour diminuer la taille de cette table, on peut n’y mettre que des fichiers qui ont plusieurs noms, c’est-à-dire tels que st_nlink > 1.
     
   let copied_files = (Hashtbl.create 53 : ((int * int), stringHashtbl.t)
   
   let rec copy source dest =
     let infos = lstat source in
     match infos.st_kind with
       S_REG ->
         if infos.st_nlink > 1 then begin
           try
             let dest' =
               Hashtbl.find copied_files (infos.st_devinfos.st_ino)
             in link destdest
           with Not_found ->
             Hashtbl.add copied_files (infos.st_devinfos.st_inodest;
             file_copy source dest;
             set_infos dest infos
         end else begin
           file_copy source dest;
           set_infos dest infos
         end
     
     | S_LNK -> ...