php/mysql - Löschen aller Dateien die nicht in der Datenbank stehen

Jacky007

Lieutenant
Registriert
Okt. 2006
Beiträge
662
Hallo,

ich habe in einer Datenbank Daten von viele Files drin (von einem One-Click-Hoster) - wollte auf dem Server alle Files löschen, die nicht in der Datenbank stehen. So sieht aktuell ein Löschscript aus, der files löscht, die 24h löschmodus aktiv haben. Kann man den Script irgendwie umschreiben, oder geht das garnicht?

Code:
hat sich erledigt, danke!
 
Zuletzt bearbeitet:
Rein von der Logik her:

Du hast zwei Mengen: Einmal die, die in der DB stehen und einmal die, die auf dem Server sind. Um dein Ziel zu erreichen musst du beide irgendwie miteinander vergleichen.
Also machst du dir mit einem SELECT ein Array mit den Dateien, die in der DB stehen und mit einem ls und awk eine hübsche Liste der Dateien, die auf dem Server liegen.

Hast du überhaupt Ahnung von Programmierung? Weißt du überhaupt was der Code da oben macht? Hast du das überhaupt selbst geschrieben?

Leute sind heutzutage echt zu Faul zum Googlen:

https://stackoverflow.com/questions/36576961/delete-files-from-server-which-name-is-not-in-database

"delete-files-from-server-which-name-is-not-in-database " Das ist genau das was du brauchst, musst es nur anpassen.
 
Danke hat sich erledigt.
 
Schoen dass du im Nachhinein die Frage geaendert hast, anstatt die Loesung hier zu veroeffentlichen. Sollte man ueberall so machen, koennte ich mir auch gut als Konzept auf StackOverflow vorstellen ...
 
Sehe spontan ein paar Ansätze.

Ad 1, "SELECT id,filename FROM images ORDER BY id" und dann jede Datei aus der Liste mit einem Flag versehen.
Das Flag kann ich in der DB setzen, muß dann aber natürlich ordentlich Einträge anlegen für die fehlenden Dateien. Oder ich setz es auf der Datei, soweit ich die Möglichkeit dazu hab (ran darf), dann spar ich mir das.
Läuft in-place mit allen Vor- und Nachteilen, die das hat.
Laufzeit linear mit Anzahl der Einträge in der DB bzw. Anzahl der vorhandenen Dateien.


Ad 2, ich räume den gesamten Haufen Dateien irgendwo aus dem Weg, gehe dann die Liste aller Datenbankeinträge durch und versuche, die zugehörige Datei aus dem Temp-Pfad wieder an seinen angestammten Ort zu restaurieren. Die anderen Dateien bleiben mangels Match automatisch außen vor. Hat aber das Problem, daß der zugehörige Service in der Zwischenzeit nicht funktionieren wird, wenn man nicht für die Zeit den Suchpfad für die Dateidaten entsprechend erweitern kann.

Laufzeit linear mit Anzahl der Datenbankeinträge, "semi-in-place" dahingehend daß zwar kein zusätzlicher Speicherplatz benötigt wird, aber zur Laufzeit der Pfad einer jeden Datei undefiniert ist und daher der Service als DEFUNCT verstanden werden muß.

Prinzipiell geht auch Ad 3, aber das nur der Vollständigkeit halber: man schmeißt die IMAGES-Tabelle weg und generiert sie auf Basis der vorhandenen Dateidaten neu. Kann man auch mit (1) oben verbinden und der DB nur die dort fehlenden Dateiobjekte hinzufügen, wenn man das will.
Hinterher sind keine verwaisten Dateien mehr auf der Festplatte, und wenn man entsprechende Flags setzt, bekommt man denselben Effekt wie in (1) oben. Ist aber aufwendiger und macht nur Sinn, wenn man eine gewisse Synchronisation für sinnvoll hält, zB weil man weder DBEntries \ Dateidaten noch Dateidaten \ DBEntries kennt. Am Ende hat man auf diesem Weg in der Datenbank die Menge aller jemals vorhandenen Dateien mit einem Flag aus DB_FEHLT (Datei da, Eintrag generiert), FS_FEHLT (DB-Eintrag da, aber Datei fehlt) und STATUS_OK (beides vorhanden). Der vierte Zustand (Datei fehlt, DB-Eintrag auch) kann nicht angenommen werden.
 
  • Gefällt mir
Reaktionen: Jacky007
Danke dir RalphS für die Vorschläge,
 
Zurück
Oben