Clones

amp_god 31.12.03 01:31

Etsii sisällöltään samanlaisia tiedostoja MD5 summan avulla..

 Tekstiversio  Arvo: -1 (2 ääntä)  Äänestä: +  -
[code]
<?php
### Settings... ###
$datafile = "/tmp/clones.tmp"# Väliaikainen tiedosto (tallennetaan MD5 summat ja tiedoston nimet)
$clonelist = "/tmp/clones.list"# "Tulos" tiedosto... sisältää listan "alkuperäisistä" ja kopioista...
$path_to_check = array("/ensimmainen/kansio", "/toinen/kansio")# Mistä etsitään....
$min_size = 1024 * 1024; #Tiedostojen minimikoko (oletuksena 1024*1024 eli ~1M)
###################
$time_alku=explode(" ", microtime());
$time_alku=$time_alku[0] + $time_alku[1];
set_time_limit(0);
ini_set(memory_limit, 500000000);
### Cleanup ###
print("Cleaning up $datafile..");
$save = fopen($datafile, "w");
fwrite($save, "");
fclose($save);
print("OK\n");
print("Cleaning up $clonelist..");
$save = fopen($clonelist, "w");
fwrite($save, "");
fclose($save);
print("OK\n");
##############
function nice_md5($tiedosto) {
  global $md5_checking;
  $tiedosto2 = addslashes($tiedosto);
  if(!preg_match("/\'/", $tiedosto)) { $data = @shell_exec("md5sum \"$tiedosto2\""); }
  $data = explode("  ", $data);
  $md5 = $data[0];
  if($md5 == "") {
    $file = fopen($tiedosto, "r");
    $file_data = fread($file,filesize($tiedosto));
    fclose($file);
    $md5 = md5($file_data);
  }
  return $md5;
}
function tallenna_listaan($md5, $file) {
  global $datafile;
  $save = fopen($datafile, "a");
  fwrite($save, "$md5 && $file\n");
  fclose($save);
}
function onko_listassa($md5) {
  global $datafile;
  $file = fopen($datafile, "r");
  $taukka = fread($file,filesize($datafile));
  fclose($file);
  $taukka = explode("\n", $taukka);
  $result = FALSE;
  foreach($taukka as $rivi) {
    $rivi = explode(" && ", $rivi);
    if(!$false && $md5 == $rivi[0]) { $result = $rivi[1]; }
  }
  unset($taukka);
  return $result;
}
function tallenna_clone($tiedosto, $check) {
  global $clonelist;
  $save = fopen($clonelist, "a");
  fwrite($save, "$tiedosto is clone of $check\n");
  fclose($save);
}
function nice_int($num) {
## Ei toimi jostain perversista syysta.. ##
#  $ext = $num - round($num);
#  $size = strlen($num);
#  $laskuri = 0;
#  while($size != 0) {
#    $size--; $laskuri++;
#    $out = "$num[$size]$out";
#    if($laskuri % 3 == 0) { $out = ",$out"; }
#  }
#  if($ext != "") { $out = "$out.$ext"; }
#  return $out;
############################################
  return $num;
}
###############
print("Generating list....");
if(!is_array($path_to_check)) { $lista = shell_exec("find $path_to_check"); }
if(is_array($path_to_check)) {
  foreach($path_to_check as $path) {
    $lista .= shell_exec("find $path");
  }
}
print("OK\n");
$lista = explode("\n", $lista);
natcasesort($lista);
$ok = 0; $clones = 0; $files = 0; $totalsize = 0;
foreach($lista as $tiedosto) {
  if($tiedosto != "" && is_file($tiedosto) && filesize($tiedosto) > $min_size) {
    $files++;
    print("Loading $tiedosto......\n");
    print("FileSize=");
    $load_alku=explode(" ", microtime());
    $load_alku=$load_alku[0] + $load_alku[1];
    $len = filesize($tiedosto);
    $totalsize = $totalsize + $len;
    $len = nice_int($len);
    print("$len, ");
    $file_data_md5 = filesize($tiedosto);
    $check = onko_listassa($file_data_md5);
    if($check && $tiedosto != $check) {
      if(nice_md5($tiedosto) == nice_md5($check)) {
        print("File $tiedosto is clone of $check...\n");
        tallenna_clone($tiedosto, $check);
        $clones++;
      }
    }
    if(!$check) {
      tallenna_listaan($file_data_md5, $tiedosto);
      $ok++;
    }
    $load_loppu=explode(" ", microtime());
    $load_loppu=$load_loppu[0] + $load_loppu[1];
    $load = round($load_loppu - $load_alku, 2);
    #$speed = round($len / $load);
    print(" ,Processtime=$load\n");
    print("-----------------------------------\n");
  }
}
$time_loppu=explode(" ", microtime());
$time_loppu=$time_loppu[0] + $time_loppu[1];
$time = round($time_loppu - $time_alku, 2);
$avg_files = nice_int(round($files / $time,2));
$avg_bytes = nice_int(round($totalsize / $time,2));
print("Summary of $path_to_check:\n");
print("Total Files    : $files, ($avg_files files/sec)\n");
print("Unique files   : $ok\n");
print("Clones!!       : $clones\n");
print("Total size     : $totalsize, ($avg_bytes bytes/sec)\n");
print("Execution time : $time secs\n");
?>
[/code]
Koodi toimii sellaisenaan.. eli php clones.php .... Itse raksasin scriptin, jotta näin onko autovideokansiossa samoja pätkiä moneen kertaan...

renni 12:19 31.12.03 
Onko järkeä verrata MD5:sia kun vois verrata tiedostoja suoraankin?
amp_god 16:19 31.12.03 
renni: kannasta tulee suhteellisen suuri jos on enemmän kuin 2 tiedostoa ;D
Ja ei se MD5:sen laskeminen niin kamalan raskasta ole.. (jos sisällön pukkaa tiedostoon).... mutta jos taas tiedostojen nimet vaan pukkaa kantaan, niin silloon ei tosiaankaan löydy muutakuin korkeintaan saman nimiset tiedostot.. samaa sisältöä mutta eri nimellä ei löydy muutakuin tuolla MD5 summalla.
Buzer 21:19 31.12.03 
Idea ihan hyvä, mutta koon vertaaminen olisi ollut parempi. Tuskinpa löytyy täsmälleen samankokoisia tiedostoja jotka ovat erejä kovin montaa. Toki jotain ei-oikeitakin löytyy, mutta ne voisi verrrata sitten md5:lla.
Eli etsiä kaikki samankokoiset tiedostot ja sitten vertaamalla samankokoisten tiedostojen md5 summia.
amp_god 21:10 1.1.04 
Hmm... pelkkien kokojen vertaaminen tosin olis paaljon nopeampaa..... :P ... pitää yrittää vedellä tosta v1.1 missä verrataan ensin kokoja sitten vasta MD5 summia :9
----
Tosin tuo nice_int() funktio kummastuttaa.... yksinään se toimii 100% oikein, mutta tämän scriptin yhteydessä ei vaikka miten tekis :/
amp_god 22:15 1.1.04 
Doddii.. nyt on ensin tiedoston koon vertailu, sitten kun löytyy samankokoista -> tarkastetaan MD5..
amp_god 22:31 1.1.04 
heh... nopeutti scriptiä varmaan noin ~10X vauhtiin :))
Kiitos korjausehdotuksesta Buzer...
Buzer 12:31 6.1.04 
Eikös number_format ( http://fi2.php.net/number_format ) kävisi tuon nice_intin tilalta? Mielestäni se ajaa saman asian...
amp_god 09:45 9.1.04 
Hmm.. voisi kyllä auttaa toi number_format.. *g*.. saisi tulostusta pikkasen fiksumman näköiseksi...