WBCE CMS Forum

WBCE CMS – Way Better Content Editing.

Du bist nicht angemeldet.

#1 27.02.2020 17:13:50

better-work
Mitglied

Bereinigung für Backup Tool

Hallo liebe Mitstreiter,

musste gerade manuell ein Backup Verzeichnis aufräumen, das war nicht lustig...
Ich benötige eigentlich nur ein Script das nur die letzten 30 Backups (nach zeitlicher Relevanz) im Verzeichnis lässt, und den Rest löscht.
Also nicht Dateien -- ÄLTER ALS -- sondern nur die letzten 30 Behalten und die Älteren löschen.
Dies kann ich dann per Cronjob ausführen...

Wer kann helfen und zu welchem Kurs?
Sicherlich wäre ein universelles PHP-Script nützlich.

1.) es sollte im gleichen Verzeichnis liegen und sich nicht selbst mit löschen wollen
2.) Dateiendungen sollten individuell eingegeben werden können (z.B= *.tar.gz / .sql.gz)


Gruß Jörg

Offline

#2 27.02.2020 18:19:00

florian
Administrator

Re: Bereinigung für Backup Tool

Du beziehst Dich vermutlich auf das finale Script aus diesem Thread?
https://forum.wbce.org/viewtopic.php?id=1175

Ein Ansatz dazu, wobei ich jetzt nicht konkret weiß, wie das einzubauen wäre:
https://stackoverflow.com/questions/911 … t-the-last


Code allein macht nicht glücklich. Jetzt spenden!

Offline

#3 28.02.2020 00:35:57

better-work
Mitglied

Re: Bereinigung für Backup Tool

Ja, ganz genau darum geht es...
Das hatte ich auch gefunden. Allerdings bin ich da mit der Anpassung etwas überfordert.
Und es darf ja auch gerne ein separates Script sein.
Deshalb hatte ich die Parameter beschrieben.

Ich bin leider nicht wirklich fündig geworden.
Auch ein Cronbefehl ist mir leider nicht bekannt, bzw. auch dazu habe ich nichts gefunden.

Trotzdem vielen Dank für Deine Hilfe.


Gruß Jörg

Offline

#4 28.02.2020 09:54:58

webbird
Administrator

Re: Bereinigung für Backup Tool

Welches OS ist das denn? (Wegen dem Cron-Befehl.)

Ich kann mir das Script der Wahl gern mal angucken, da jetzt zwei verlinkt wurden, müßte ich aber vorher wissen, welches präferiert wird.


Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

#5 28.02.2020 10:03:36

webbird
Administrator

Re: Bereinigung für Backup Tool

Nur mal so ins Blaue...

Teil 1: Dateien ermitteln

Da paßt dieser Code-Abschnitt von Stackoverflow schon ganz gut. (Wobei das Pseudocode ist, sowas wie pathere wäre ja zu ersetzen durch was Sinnvolles.)

[== PHP ==]
$directory = array_diff(scandir(pathere), array('..', '.'));
$files = [];
foreach ($directory as $key => $file) {
    $file = pathere.$file;
    if (file_exists($file)) {
        $name = end(explode('/', $file));
        $timestamp = preg_replace('/[^0-9]/', '', $name);
        $files[$timestamp] = $file;
    }
}

Hier werden _alle_ Dateien ausgelesen und deren Timestamp aus dem Dateinamen gefischt. Diesen Teil müßte man nun so anpassen, dass nach Dateiendungen geschaut und das Zugriffsdatum der Datei verwendet wird, statt das Datum aus dem Namen zu extrahieren.

Als Ergebnis hat man ein Array namens $files, dessen Schlüssel das Datum und dessen Werte der jeweilige Dateiname sind.

Dieses Array kann man nun recht einfach nach dem Datum sortieren, die 30 aktuellsten Dateien rausnehmen und den Rest löschen.

Wo und wie wäre denn die Konfiguration der Dateiendungen gewünscht? Einfach im Script selbst? Wie soll das Script abgesichert werden? (Wer die URL kennt bzw. erraten kann soll das ja nicht einfach so ausführen können...)


Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

#6 28.02.2020 11:14:40

better-work
Mitglied

Re: Bereinigung für Backup Tool

Hallo
eine Absicherung ist nicht erforderlich, es erfolgt eine Authentifizierung per. htaccess Datei.
Was leider ein bisschen ungünstig ist, ist die Tatsache dass ich relativ wenige Cronjobs habe.
Bisher habe ich jedem Kunden 2 zugewiesen.
1. für SQL Backup
2. für Daten Backup
Schön wäre es aber, wenn die Bereinigung nicht noch 2 zusätzliche Jobs benötigen würde.
Weil nach SQL und Datenbackup getrennt.
Sondern die Bereinigung der Daten zumindest in einem Job erledigt werden könnte.
In diesem Fall dann also in einem 3. Job.
Vorab stellt sich auch die Frage nach den Kosten.
Wenn das Ganze zu teuer wird, führe ich die Bereinigung eben weiter manuell durch.
Das müsste ich bitte vorher wissen...


Gruß Jörg

Offline

#7 28.02.2020 11:25:42

webbird
Administrator

Re: Bereinigung für Backup Tool

Probier' mal. Löscht nix, sondern liefert nur eine Liste von Dateien, die NICHT gelöscht würden. Kannst Du hinlegen wo Du willst, es benutzt keine WBCE-Includes oder irgendwas.

[== PHP ==]
<?php

$path = __dir__;                        // path to scan
$suffixes = array('.tar.gz','.sql.gz'); // suffixes to scan for
$keep = 30;                             // number of files to keep

// get the list of files that match the suffix list
$rawlist = preg_grep('~('.implode('|',$suffixes).')$~i', array_diff(scandir($path), array('..', '.')));

// if we do not have more files than to keep, there's nothing to do at all
if(count($rawlist) <= $keep) { exit; }

$files = array();

// get last modification time for each file
foreach($rawlist as $f) {
    $ts = filemtime($path.'/'.$f);
    $files[$f] = $ts;
}

// sort the files array by timestamp
asort($files);

// remove $keep youngest
array_splice($files,0,(count($files)-$keep));

echo "FILES TO KEEP:<br /><textarea style=\"width:100%;height:200px;color:#000;background-color:#fff;\">";
print_r($files);
echo "</textarea><br />";

Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

#8 28.02.2020 11:27:56

webbird
Administrator

Re: Bereinigung für Backup Tool

Ich hab das bei mir mal auf das Log-Verzeichnis von BC2 gehetzt, eine Sache ist mir dabei aufgefallen: Angenommen, es gibt mehrere Dateien mit EXAKT dem gleichen Zeitstempel, und diese beiden liegen genau auf der Grenze der Dateien, die nicht gelöscht werden... Dann kann es sein, dass eine davon gelöscht wird, die andere aber nicht.


Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

#9 28.02.2020 14:59:43

better-work
Mitglied

Re: Bereinigung für Backup Tool

Erst einmal vielen Dank für Deine Mühe.
Das unterschiedliche Behalten wäre natürlich ein Problem.
Ansonsten habe ich es getestet und eingedeutscht, funktioniert einwandfrei.

Gibt es in PHP eine Möglichkeit ein Script am Ende des ersten Scriptes zu starten, wenn das erste Script durchgelaufen ist?
Denn dann könnte der Aufruf jeweils am Ende der Backupscripte erfolgen, wenn das eigentliche Backup erledigt ist.

Da wäre dann nur noch die Problematik das beide Sicherungsverzeichnisse unterschiedlich sind:

Verzeichnisstruktur=
https://mydomain.de/001-backup (damit der Ordner oben steht)
https://mydomain.de/001-backup/sql (für die MySQL Sicherungen)
https://mydomain.de/001-backup/webspace (für die Dateien, Medien, Verzeichnisse, etc.)

Die Scripte liegen immer direkt im Ordner "001-backup"

Also=
https://mydomain.de/001-backup/db-backup.phpx
https://mydomain.de/001-backup/ftp-backup.phpx

Ich habe hier mal die Zitat Funktion missbraucht, um es Besser hervorzuheben...


Gruß Jörg

Offline

#10 28.02.2020 15:13:14

webbird
Administrator

Re: Bereinigung für Backup Tool

Also wenn Du einen Scriptaufruf ans Ende packen kannst, kannst Du auch den kompletten Code ans Ende packen, oder?

Ansonsten

include <Datei>;

Wenn die Verzeichnisse bzw. Einstellungen unterschiedlich sind, mach halt zwei Kopien von dem Script. Alternativ in die Sicherungsscripten unten den kompletten Code einfügen, dann hast Du ja zwei getrennte Instanzen.

Das unterschiedliche Behalten wäre natürlich ein Problem.

Das erfordert aber einen exakt gleichen Timestamp. Sind die Dateien mindestens 1 Sekunde auseinander, wird die ältere gelöscht. Auch wenn "älter" hier nur 1 Sekunde bedeutet.


Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

#11 28.02.2020 15:16:47

webbird
Administrator

Re: Bereinigung für Backup Tool

Hier jetzt erst mal mit UMBENENNEN statt LÖSCHEN, damit wir wirklich sicher sind, dass die richtigen Dateien gelöscht würden.

<?php

$path = __dir__;                        // path to scan
$suffixes = array('.tar.gz','.sql.gz'); // suffixes to scan for
$keep = 30;                             // number of files to keep

// get the list of files that match the suffix list
$rawlist = preg_grep('~('.implode('|',$suffixes).')$~i', array_diff(scandir($path), array('..', '.')));

// if we do not have more files than to keep, there's nothing to do at all
if(count($rawlist) <= $keep) { exit; }

$files = array();

// get last modification time for each file
foreach($rawlist as $f) {
    $ts = filemtime($path.'/'.$f);
    $files[$f] = $ts;
}

// sort the files array by timestamp
asort($files);

// remove $keep youngest
$files = array_splice($files,0,(count($files)-$keep));

if(count($files)>0) {
    foreach($files as $file => $ts) {
        rename($path.'/'.$file,$path.'/'.$file.'.RENAMED');
    }
}

Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

#12 28.02.2020 16:36:16

better-work
Mitglied

Re: Bereinigung für Backup Tool

Okay, erst einmal vielen Dank, ich muss mir das noch einmal in Ruhe ansehen,
momentan muss ich mich hier aber noch um eine andere Problematik kümmern.

Ich werde es mit dem Einfügen des Codes auf einer "ungefährlichen" Domain testen und melde mich dann noch einmal.


Gruß Jörg

Offline

#13 11.03.2020 15:09:06

better-work
Mitglied

Re: Bereinigung für Backup Tool

@webbird

Wie bereits per PM mitgeteilt, komme ich mit der Einbindung leider nicht zurecht.
Dementsprechend benötige ich bitte eine fertige Lösung dazu, daher ja auch gegen Bezahlung...
Am Anfang des Skriptes sollte dann auch definiert werden können, wie viele Sicherungen aufgehoben werden sollen.
In den Skripten sind die Pfade bereits definiert, es wäre sehr hilfreich, wenn die Bereinigung das direkt so übernehmen könnte!

Den Rest hatte ich ja schon per PM am 04.03. mitgeteilt ;-)


Gruß Jörg

Offline

#14 21.08.2020 09:24:30

better-work
Mitglied

Re: Bereinigung für Backup Tool

@webbird

vorsichtige Nachfrage...
Konntest Du Dich schon näher mit dem Projekt befassen?


Gruß Jörg

Offline

#15 21.08.2020 16:54:26

webbird
Administrator

Re: Bereinigung für Backup Tool

Ehrlich gesagt hatte ich das komplett vergessen, und momentan habe ich auch leider keine Luft dafür.


Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

#16 05.05.2021 13:18:04

better-work
Mitglied

Re: Bereinigung für Backup Tool

@All @webbird

Die Auflistung der Files klappt sehr gut.
Wie können jetzt die zu löschenden Dateien auch gelöscht werden?

// remove $keep youngest
array_splice($files,0,(count($files)-$keep));

Und hier noch einmal das gesamte Skript von webbird=

[== PHP ==]
<?php

$path = __dir__;                        // zu scannender Pfad
$suffixes = array('.tar.gz','.sql.gz'); // Dateiendungen zum Scannen
$keep = 10;                             // Anzahl der aufzubewahrenden Dateien

// die Liste der Dateien erhalten, die der Suche entsprechen
$rawlist = preg_grep('~('.implode('|',$suffixes).')$~i', array_diff(scandir($path), array('..', '.')));

// wenn wir nicht mehr Dateien haben, als wir behalten müssen, gibt es überhaupt nichts zu tun
if(count($rawlist) <= $keep) { exit; }

$files = array();

// die Liste der Dateien erhalten, die der Suche und dem Zeitstempel entsprechen
foreach($rawlist as $f) {
    $ts = filemtime($path.'/'.$f);
    $files[$f] = $ts;
}

// letzte Änderungszeit für jede Datei erhalten
asort($files);

// Jüngere Dateien behalten - ältere nach Vorgabe löschen!
array_splice($files,0,(count($files)-$keep));

echo "Dateien die zu behalten sind:<br /><br /><textarea style=\"width:100%;height:500px;color:#000;background-color:#fff;\">";
print_r($files);
echo "</textarea><br />";

?>

Gruß Jörg

Offline

#17 04.08.2021 23:30:19

chap
Mitglied

Re: Bereinigung für Backup Tool

Mahlzeit,

Das Script ist eine feine Sache!
Wie mache ich den nun, das er auch anfängt die Dateien zu löschen die nicht gelöscht werden sollen?


Liebe Grüße,
cHAp

Offline

#18 05.08.2021 08:26:49

webbird
Administrator

Re: Bereinigung für Backup Tool

Im ersten Schritt würde ich die Ausgabe mal umkehren, um zu sehen, dass auch die richtigen Dateien gelöscht würden.

Zeile

[== PHP ==]
array_splice($files,0,(count($files)-$keep));

ändern in

[== PHP ==]
$to_delete = array_splice($files,0,(count($files)-$keep));

Und dann hinter

[== PHP ==]
echo "Dateien die zu behalten sind:<br /><br /><textarea style=\"width:100%;height:500px;color:#000;background-color:#fff;\">";
print_r($files);
echo "</textarea><br />";

hinzufügen:

[== PHP ==]
echo "Dateien die zu entfernen sind:<br /><br /><textarea style=\"width:100%;height:500px;color:#000;background-color:#fff;\">";
print_r($to_delete);
echo "</textarea><br />";

Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

#19 05.08.2021 19:15:11

chap
Mitglied

Re: Bereinigung für Backup Tool

Hey Ho,

Ok, die Ausgaben Passen. Wie kann ich das nun machen das entsprechend die Dateien auch gelöscht werden?


Liebe Grüße,
cHAp

Offline

#20 08.08.2021 13:32:18

chap
Mitglied

Re: Bereinigung für Backup Tool

Hallo,

Wurde ich hier vergessen?


Liebe Grüße,
cHAp

Offline

#21 09.08.2021 11:28:03

webbird
Administrator

Re: Bereinigung für Backup Tool

Nein, das war Absicht.


Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

#22 09.08.2021 12:01:11

florian
Administrator

Re: Bereinigung für Backup Tool

Ich steck' nicht in der Thematik, was wird denn in der aktuellen Form vom Script ausgegeben?
Kann man da dann einfach unlink() drauf anwenden?

Beitrag geändert von florian (09.08.2021 12:01:25)


Code allein macht nicht glücklich. Jetzt spenden!

Offline

#23 09.08.2021 13:17:01

chap
Mitglied

Re: Bereinigung für Backup Tool

Na für mich ist nur wichtig, dass das löschen noch funktioniert. Das ist das einzige was nun fehlt noch. :-( Ansonsten ist es jetzt für mich Perfekt.


Liebe Grüße,
cHAp

Offline

#24 17.08.2021 06:55:06

better-work
Mitglied

Re: Bereinigung für Backup Tool

@webbird

Vielen Dank für Deine Bearbeitung. Die Auflistung funktioniert schon Super!
Jetzt wäre die tatsächliche Löschfunktion natürlich interessant.
Gerne kannst Du mir dann auch eine Rechnung für Deine Arbeit senden, das soll ja hier auch nicht für einen warmen Händedruck passieren!

@florian

Ja, unlink() würde sicher die Lösung bringen, allerdings wüßte ich nicht, wie die korrekte Liste übergeben wird, um diese dann zu löschen!
Nicht das die falsche Auflistung übergeben wird...


Gruß Jörg

Offline

#25 17.08.2021 09:53:10

webbird
Administrator

Re: Bereinigung für Backup Tool

Da wird ja jetzt eine Liste von Dateien ohne Pfad ausgegeben, z.B.:

(
    [core_error.log] => 1606833738
)

Also packen wir eine Schleife drumrum und ergänzen beim unlink() den Pfad:

[== PHP ==]
<?php

$path = __dir__;                        // zu scannender Pfad
$suffixes = array('.tar.gz','.sql.gz'); // Dateiendungen zum Scannen
$keep = 10;                             // Anzahl der aufzubewahrenden Dateien

// die Liste der Dateien erhalten, die der Suche entsprechen
$rawlist = preg_grep('~('.implode('|',$suffixes).')$~i', array_diff(scandir($path), array('..', '.')));

// wenn wir nicht mehr Dateien haben, als wir behalten müssen, gibt es überhaupt nichts zu tun
if(count($rawlist) <= $keep) { exit; }

$files = array();

// die Liste der Dateien erhalten, die der Suche und dem Zeitstempel entsprechen
foreach($rawlist as $f) {
    $ts = filemtime($path.'/'.$f);
    $files[$f] = $ts;
}

// letzte Änderungszeit für jede Datei erhalten
asort($files);

// Jüngere Dateien behalten - ältere nach Vorgabe löschen!
$to_delete = array_splice($files,0,(count($files)-$keep));

if(!empty($to_delete)) {
    foreach(array_keys($to_delete) as $f) {
        echo "Loesche: $path/$f\n";
        unlink($path.'/'.$f);
    }
}

Die Zeile mit dem echo kann man natürlich auskommentieren, wenn das Script automatisiert läuft.


Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Online

Liked by:

better-work

Fußzeile des Forums

up