要件:
ファイルの違いを含む 2 つのフォルダー間の違いを比較するには、コマンド ラインのみを使用できます。
思考:
Linux では diff がありますが。 。 。 。 PHP を使用してみましょう。コードの変更は簡単かつ迅速です。以下では .svn ディレクトリの比較は省略します。
ファイルはMD5チェックサムと比較する必要があります
アイデア:
1) 最初のパスを標準パスとして使用し、最初のパスにあるが 2 番目のパスにないファイルまたはフォルダー、または別のファイルをリストします。
2) 次に、2 番目のパスには存在するが、最初のパスには存在しないファイルとフォルダーをリストします。
呼び出し例:
php Compare_folder.php /home/temp/2 /home/temp/55
//JAVAEYEより転載
/** * ツールファイル * 目的は 2 つのフォルダーを再帰的に比較することです * * 呼び出し例 * php Compare_folder.php /home/temp/2 /home/temp/55 * */ //パラメータ決定if (count($argv) > 1 ) $dir1 = del_postfix($argv[1]); $dir1 = '/'; if (count($argv) > 2 ) $dir2 = del_postfix($argv[2]); else //最初の 1 つのパスにはそれがありますが、後者にはそれがないか、間違った方法があります。 process_compare($dir1, $dir2, 0); echo "================================= === ========================n"; //2 番目のパスに余分なフォルダーまたはファイルがないか確認しますprocess_compare($dir2, $ dir1 , 1); echo "すべて OKn"; /** * パスの末尾の / を削除し、絶対パスであることを確認してください * * @paramknown_type $dir * @returnunknown */ function del_postfix($dir) { if (!preg_match('#^/#', $dir)) { throw new Exception('パラメータは絶対パスでなければなりません'); $dir = preg_replace('#/$#', '', $dir); /* * * 再帰メソッドを呼び出して比較を実装するパブリック関数 * * 標準パスとして @param string $dir1 * @param string $dir2 比較に使用されるパス * @param int $only_check_has 1 はファイルがないことを意味します差分が比較されます。値 0 は、ファイルの md5 チェックサムも比較する必要があることを意味します*/ function process_compare($dir1, $dir2, $only_check_has){ Compare_file_folder($dir1, $dir1, $dir2, $only_check_has) } /** * 実数関数、プライベート関数 * * @param string $dir1 パス 1、標準です * @param string $base_dir1 変更されないパラメーター パス 2 * @param string $base_dir2 変更されない比較対象のパス 2 * @ param int $only_check_has 1 の場合、ファイルの差分が比較されないことを意味します。 0 の場合、ファイルの md5 チェックサムも比較されることを意味します。*/ function Compare_file_folder( $dir1, $base_dir1, $base_dir2, $only_check_has=0){ if (is_dir($dir1)) { $handle = dir($dir1) if ($dh = opendir($dir1); while ($entry = $handle->read()) { if (($entry != ".") && ($entry != "..") && ($entry != ".svn") ){ $new = $dir1."/".$entry; //echo 'compare: ' . $new . "n"; $other = preg_replace('#^'. $base_dir1 .'#' , $base_dir2 , $new); if(is_dir($new)) { //比較 if (!is_dir($other)) { 方向が見つかりません: ' (' . $new .")n"; } Compare_file_folder($new, $base_dir1,$base_dir2, $only_check_has) ; } else { //1 がファイルの場合、2 もファイルである必要があります if (!is_file ($other) ) { echo '!!ファイルが見つかりません: ' ('.$new .")n" }elseif ($only_check_has ==0 && ( md5_file($other) != md5_file($new ) ){ echo '!!file md5 エラー: ' ('.$new .")n" } } } Closedir($dh); } } } ?>
コードをコピー
|