私はPHPを使用しており、次のようなスクリプトを作成する必要があります。
2つのフォルダー構造を比較する必要があり、ソースフォルダーを参照して、参照ソースフォルダーに存在しない他の宛先フォルダーに存在するすべてのファイル/フォルダーを削除したいのですが、どうすればよいですか?
編集:
$original = scan_dir_recursive('/var/www/html/copy2');
$mirror = scan_dir_recursive('/var/www/html/copy1');
function scan_dir_recursive($dir) {
$all_paths = array();
$new_paths = scandir($dir);
foreach ($new_paths as $path) {
if ($path == '.' || $path == '..') {
continue;
}
$path = $dir . DIRECTORY_SEPARATOR . $path;
if (is_dir($path)) {
$all_paths = array_merge($all_paths, scan_dir_recursive($path));
} else {
$all_paths[] = $path;
}
}
return $all_paths;
}
foreach($mirror as $mirr)
{
if($mirr != '.' && $mirr != '..')
{
if(!in_array($mirr, $original))
{
unlink($mirr);
// delete the file
}
}
}
上記のコードは私がしたことを示しています。ここで私のcopy1フォルダーにはcopy2フォルダーよりも余分なファイルが含まれているため、これらの余分なファイルを削除する必要があります。
編集済み: 以下の出力は、元のミラーの配列と両方の違いです。
Original Array
(
[0] => /var/www/html/copy2/Copy (5) of New Text Document.txt
[1] => /var/www/html/copy2/Copy of New Text Document.txt
)
Mirror Array
(
[0] => /var/www/html/copy1/Copy (2) of New Text Document.txt
[1] => /var/www/html/copy1/Copy (3) of New Text Document.txt
[2] => /var/www/html/copy1/Copy (5) of New Text Document.txt
)
Difference Array
(
[0] => /var/www/html/copy1/Copy (2) of New Text Document.txt
[1] => /var/www/html/copy1/Copy (3) of New Text Document.txt
[2] => /var/www/html/copy1/Copy (5) of New Text Document.txt
)
差分配列で削除するループを繰り返すと、表示された出力に従ってすべてのファイルを削除する必要があります。これを修正するにはどうすればよいですか。削除のループを以下に示します。
$dirs_to_delete = array();
foreach ($diff_path as $path) {
if (is_dir($path)) {
$dirs_to_delete[] = $path;
} else {
unlink($path);
}
}
while ($dir = array_pop($dirs_to_delete)) {
rmdir($dir);
}