Как найти одинаковые файлы с разными именами в PHP

Допустим ситуацию – при парсинге с сайта-донора на свой сайт перенеслось множество изображений-заглушек, причем у всех файлов разные названия. От сюда вытекает задача найти и удалить все такие файлы.

Для примера возьмём следующий файл:
Его MD5-хеш равен: 

  1. 14728910cb850c60c4d989e168709d58
.

Далее понадобится PHP-скрипт, который получит все файлы в директории и сравнит их хеши с эталоном, если хеши совпадут, то файл будет удален.
  1. <?php
  2. header('Content-type: text/html; charset=utf-8');
  3.  
  4. $path = $_SERVER['DOCUMENT_ROOT'] . '/uploads';
  5. $md5 = '14728910cb850c60c4d989e168709d58';
  6.  
  7. foreach(glob($path . '/*') as $file) {
  8. if (is_file($file)) {
  9. if (md5_file($file) == $md5) {
  10. echo $file . ' - удален' . PHP_EOL;
  11. unlink($file);
  12. }
  13. }
  14. }

Результат работы скрипта:
/docs/uploads/caps.png - удален
Поиск в подкатегориях
Чтобы расширить поиск на подкатегории, потребуется рекурсивная функция:
  1. <?php
  2. header('Content-type: text/html; charset=utf-8');
  3.  
  4. function remove_duplicate_files($path, $md5)
  5. {
  6. if ($files = glob($path . '/*')) {
  7. foreach($files as $file) {
  8. if (is_dir($file)) {
  9. remove_duplicate_files($file, $md5);
  10. } else {
  11. if (md5_file($file) == $md5) {
  12. echo $file . ' - удален' . PHP_EOL;
  13. unlink($file);
  14. }
  15. }
  16. }
  17. }
  18. }
  19.  
  20. $path = $_SERVER['DOCUMENT_ROOT'] . '/uploads';
  21. remove_duplicate_files($path, '14728910cb850c60c4d989e168709d58');

Результат:
/docs/uploads/caps.png - удален
/docs/uploads/contents/caps.png - удален
/docs/uploads/contents/caps.png.bak - удален
/docs/uploads/files/caps.png - удален


  19.01.24 / 16:25 | PHP |   48 | 0   0