아래는 10MB 넘는 파일중에서 중복된 파일을 찾아서 파일에 결과물을 남기도록 하였다. 기존에 Perl, Python, Ruby 등으로 만들어 놓긴 했지만, PHP로 만들어보니 꽤 훌륭하게 동작한다. ^^ 코드는 그다지 최적화된 것 같지는 않지만, 참고는 할 만 할 것이다.
// ----------------------------------------- // 10MB 이상의 파일중에서 중복된 파일 찾기 // ----------------------------------------- $limit_size = 10000000; // 10MB $dst_dir = "M:\\"; $file_list = array(); $result_list = array(); // ----------------------------------------- $start_time = date("Y/m/d H:i:s", time()); $i = 0; $rdi = new RecursiveDirectoryIterator($dst_dir); try { foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::LEAVES_ONLY, RecursiveIteratorIterator::CATCH_GET_CHILD) as $path) { if ($path->isFile() && $path->getSize() > $limit_size) { $md5sum = md5_file($path->__toString()); echo "($i) [$md5sum] : ".$path->__toString()."\n"; $file_list[$i++] = $md5sum."\t".$path->__toString(); } } } catch(Exception $e) { echo "Message: ".$e->getMessage(); } foreach($file_list as $key => $value) { list($md5, $path) = split("\t", $value, 2); if(!isset($result_list[$md5])) { $result_list[$md5] = 0; } $result_list[$md5] += 1; } $i = 0; $fh = fopen("result_samefiles_".date("Ymd").".txt", "w") or die("Can't open file"); foreach($result_list as $key => $value) { if($value < 2) { continue; } // fputs ($fh, "\n[$key]\n"); fputs ($fh, "\n[$i]\n"); ++$i; foreach($file_list as $idx => $file) { list($md5, $path) = split("\t", $file, 2); if($md5 == $key) { fputs ($fh, "$path\n"); } } } fclose($fh); $end_time = date("Y/m/d H:i:s", time()); echo "\nStart Time -> $start_time \n"; echo "End Time -> $end_time \n\n";
댓글 없음:
댓글 쓰기