Löschen Sie die unerwünschten Dateien und Ordner vom Zielordner zu Quellordner im Vergleich

StackOverflow https://stackoverflow.com/questions/2793090

  •  04-10-2019
  •  | 
  •  

Frage

Ich bin mit PHP und ich brauche, um Skript so etwas wie unten:

Ich habe zwei Ordnerstruktur vergleichen und unter Bezugnahme der Quellordner I wollen alle Dateien / Ordner löschen in anderen Zielordner die in Referenzquelle nicht existieren Ordner, wie könnte ich das tun?

EDITED:

$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
     }

   }
}

Der obige Code zeigt, was ich tat .. Hier Mein copy1 Ordner enthält zusätzliche Dateien als copy2 Ordner daher brauche ich diese zusätzlichen Dateien gelöscht werden.

EDITED: Unten Ausgang ist Arrays von Original-Spiegel sind und der Unterschied beider ..

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
)

, wenn ich Iterierte eine Schleife alle Dateien auf Differenzmatrix zu löschen, wie pro angezeigter Ausgabe gelöscht werden .. wie kann ich dies beheben kann .. die Schleife zum Löschen unten angegeben wird.

$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);
}
War es hilfreich?

Lösung

Zuerst müssen Sie eine rekursive Auflistung der beiden Verzeichnissen. Eine einfache Funktion wie folgt funktioniert:

function scan_dir_recursive($dir, $rel = null) {

  $all_paths = array();
  $new_paths = scandir($dir);

  foreach ($new_paths as $path) {

    if ($path == '.' || $path == '..') {
      continue;
    }

    if ($rel === null) {
        $path_with_rel = $path;
    } else {
        $path_with_rel = $rel . DIRECTORY_SEPARATOR . $path;
    }

    $full_path = $dir . DIRECTORY_SEPARATOR . $path;
    $all_paths[] = $path_with_rel;

    if (is_dir($full_path)) {
      $all_paths = array_merge(
        $all_paths, scan_dir_recursive($full_path, $path_with_rel)
      );
    }

  }

  return $all_paths;

}

Dann können Sie ihre Differenz berechnen mit array_diff .

$diff_paths = array_diff(
    scan_dir_recursive('/foo/bar/mirror'),
    scan_dir_recursive('/qux/baz/source')
);

Iterieren über dieses Array, können Sie Löschen von Dateien starten. Verzeichnisse sind ein bisschen schwieriger, weil sie zuerst müssen leeren.

// warning: test this code yourself before using on real data!

$dirs_to_delete = array();
foreach ($diff_paths as $path) {
    if (is_dir($path)) {
        $dirs_to_delete[] = $path;
    } else {
        unlink($path);
    }
}

while ($dir = array_pop($dirs_to_delete)) {
    rmdir($dir);
}

Ich habe Dinge getestet und es sollte jetzt gut arbeiten. Natürlich nehmen Sie nicht mein Wort dafür. Achten Sie darauf, Ihren eigenen Setup sicheren Test vor reale Daten zu löschen.

Andere Tipps

Für rekursive Verzeichnisse bitte:

$modified_directory = new RecursiveIteratorIterator(
       new RecursiveDirectoryIterator('path/to/modified'), true
);
$modified_files = array();
foreach ($modified_directory as $file)
{
    $modified_files []= $file->getPathname();
}

Sie können auch andere Dinge wie $ File-> isDot () oder $ File-> isFile (). Weitere Dateibefehle mit SPLFileInfo Besuch http://www.php.net/manual /en/class.splfileinfo.php

Danke alle für die kostbare Zeit, um meine Arbeit gegeben, besonderer Dank Erisco für sein Engagement für mein Problem, Below-Code der perfekte Code ist die Aufgabe zu erledigt ich tun sollte, mit einer kleinen Änderung in der Erisco des zuletzt bearbeitet Antwort ...

$source = '/var/www/html/copy1';
$mirror = '/var/www/html/copy2';

function scan_dir_recursive($dir, $rel = null) {

  $all_paths = array();
  $new_paths = scandir($dir);

  foreach ($new_paths as $path) {

    if ($path == '.' || $path == '..') {
      continue;
    }

    if ($rel === null) {
        $path_with_rel = $path;
    } else {
        $path_with_rel = $rel . DIRECTORY_SEPARATOR . $path;
    }

    $full_path = $dir . DIRECTORY_SEPARATOR . $path;
    $all_paths[] = $path_with_rel;

    if (is_dir($full_path)) {
      $all_paths = array_merge(
        $all_paths, scan_dir_recursive($full_path, $path_with_rel)
      );
    }

  }

  return $all_paths;

}
$diff_paths = array_diff(
    scan_dir_recursive($mirror),
    scan_dir_recursive($source)
);



echo "<pre>Difference ";print_r($diff_paths);

$dirs_to_delete = array();
foreach ($diff_paths as $path) {
    $path = $mirror."/".$path;//added code to unlink.
    if (is_dir($path)) {

        $dirs_to_delete[] = $path;
    } else {

        if(unlink($path))
        {
            echo "File ".$path. "Deleted.";
        }
    }
}

while ($dir = array_pop($dirs_to_delete)) {
    rmdir($dir);
}

Zuerst tun, um eine scandir () des ursprünglichen Ordners,
dann einen scandir tun auf Spiegel-Ordner.
durchqueren den Spiegel Ordner Array starten und überprüfen, ob die Datei im scandir vorhanden ist () des ursprünglichen Ordner. so etwas wie dieses


$original = scandir('path/to/original/folder');
$mirror = scandir('path/to/mirror/folder');

foreach($mirror as $mirr)
{
   if($mirr != '.' && $mirr != '..')
   {
     if(in_array($mirr, $original))
     {
        // do not delete the file
     }
     else
     {
        // delete the file
        unlink($mirr);
     }
   }
}

Dies sollte Ihr Problem lösen. Sie müssen den obigen Code entsprechend (enthalten einige Rekursion in dem obigen Code modifizieren, zu überprüfen, ob der Ordner, dass Sie leer ist oder nicht versuchen, zu löschen, wenn sie nicht leer ist, dann werden Sie zuerst alle die Datei / Ordner löschen müssen in ihm und dann den übergeordneten Ordner löschen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top