Набор скриптов для поиска дублей файлов на php

22.03.2018

Была задача найти повторные фотографии и удалить их.

TODO: Скрипты рабочие, но не сделаны как набор отдельных файлов, нужно бы привести все в нормальный вид.

В принципе отрабатывает намного быстрее чем мог себе представить (примерно, 40 сек 10 000 файлов), т.ч. первый и второй скрипт можно объединить.

  • 1 - индексация
  • 2 - добавление md5
  • 3 - перемещение (вместо удаления), повторных.

1.php (Download)

 <?php

  require('fso.php');

  
  $oFSO = new Oddler\SOLib\classes\FSO();
  $oDir = $oFSO->linkDir('d:/Pic/');

  $aList = $oDir->scan(array('KeepFullNames'=>TRUE));
  
  $aRet = [];
  $i=0;
  foreach($aList['Files'] as $sFile)
  {
    echo $sFile. '<br />';
    $oFile = new stdClass();
      $oFile->path = $sFile;
      $oFile->size = filesize($sFile);
    $aRet[$oFile->size][] = $oFile;
    
    $i++;
  }
  
  echo '$i: '.$i. '<br />';
  
  echo '<pre>';
  print_r($aRet);
  echo '</pre>';
  
  file_put_contents('out.json', serialize($aRet));

2.php (Download)

 <?php

  $aItems = unserialize(file_get_contents('out.json'));
 

  $i=0;
  $iMax = 0;
  $iMaxPos = 0;
  $aResult = [];
  
  foreach($aItems as $sSize => $aFiles)
  {
    $iCount = count($aFiles);
/*    
    if($iCount > $iMax)
    {
      $iMax = $iCount;
      $iMaxPos = $sSize;
    }
*/

    if( $iCount > 1)
    {
//      echo '<h1>'.$sSize.'--'.$iCount.'</h1><br />';
/*
?>
<table>
<?
*/
      foreach($aFiles as $oFile)
      {
        if(!file_exists($oFile->path))
        {
          continue;
        }
        
        $i++;
        
        $oFile->md5 = md5_file($oFile->path);
        
        $aResult[$sSize][] = $oFile; 
/*
?>
    <tr>
        <td>
            <img src="file:///<?=$oFile->path;?>"/>
            <hr/>
        </td>
    </tr>
<?
*/   
      }
/*      
?>
</table>
<?*/
    }
/*
      if($i > 3)
      {
        break;
      }
*/
  }
  
  file_put_contents('out2.json', serialize($aResult));
 

3.php (Download)

 <?php

  $aItems = unserialize(file_get_contents('out2.json'));
 
  $i=0;
  foreach($aItems as $sSize => $aFiles)
  {
    $iCount = count($aFiles);
    
    echo '<h1>'.$sSize.'--'.$iCount.'</h1><br />';

    $j=0;
    foreach($aFiles as &$oFile1)
    {
      $i++;
      for($i1 = $j; $i1 < $iCount; $i1++)
      {
        $oFile2 = $aFiles[$i1];
        if($oFile1->path != $oFile2->path)
        {
          if($oFile1->md5 == $oFile2->md5)
          {
            $oFile1->duble = 1;

            rename($oFile1->path, str_replace('d:/Pic/', 'd:/Pic2/', $oFile1->path));
          }
        }
      }
      $j++;
    }
/*    
    echo '<pre>';
    print_r($aFiles);
    echo '</pre><hr />';
    
    if($i > 3)
    {
        break;
    }
*/
  }

/*
echo '<pre>';
print_r($aItems);
echo '</pre>';

  file_put_contents('out3.json', serialize($aItems));
*/


Пометки: Скрипт, script
Яндекс.Метрика