Christoph Schnauß: überzählige Dateien finden

morgens, Leute ;-)

Ich plage mich grade mit einem Problem, das ich selbst verursacht habe: in einem seit längerer Zeit laufenden Forum, das (wie ursprünglich das SELFHTML-Forum auch) auf dem alten, allerdings mehrfach umgeschriebenen Forumscript von Matt Wright aufbaut, habe ich im Lauf der Zeit ein paar tausend Beiträge bekommen. Die sind teilweise archiviert, teilweise mit der "aktuellen Forumshauptdatei" verlinkt  -  wenns Ärger gab, habe ich immer einmal im Verlauf vieler Monate ganz einfach den link aus dieser aktuellen Forumshauptdatei rausgenommen, aber ich habe versäumt, das zugehörige posting selbst zu löschen. Jaja, ihr dürft Schadenfreude äußern

Jetzt habe ich das Script erneut überarbeitet und will es neu online stellen (meine "user" werden davon gar nix merken), stelle aber fest, daß ich im "posting-Verzeichnis" rund 60 Dateien liegen habe, die ehemalige postings sind, das heißt, aus meiner "Hauptdatei" habe ich sie irgendwann mal rausgelöscht  -  und übrigens aus den diversen Threadanzeigen auch, so weit hat mein Administrationsscript funktioniert. Aber die Dateien selbst sind immer noch vorhanden. Ich weiß bloß nicht mehr, wie ich diese "überzähligen" Dateien finden und endgültig wegschmeißen kann

Bei mehreren tausend ist es mir nun zu mühsam, "von Hand" mein (FTP-)Verzeichnis-Listing mit der Indexdatei zu vergleichen. Ich weiß also im Moment nur, daß ich rund fünf Dutzend "überlüssige" Dateien (ehemalige postings) in meinem Verzeichnis liegen habe, die in der Index-Datei nicht mehr verlinkt sind. Ich will sie gerne löschen, aber ich will natürlich kine falsche Dabei erwischen.

Wie mache ich das?

Das _grundsätzliche_ Vorgehen stelle ich mir so vor:
1. meine (Forums-)Indexdatei auslesen und die Dateinamen in eine Liste schreiben
2. das Verzeichnislisting auf dem Server auslesen und die Dateinamen in eine zweite Liste schreiben
3. Beide Listen vergleichen und auf dem Server die Dateien irreversibel löschen, deren Namen nicht (mehr) in der Indexdatei stehen.

Schritt 1 kriege ich problemlos hin, aber Schritt 2 klappt nicht, also ist es illusorisch, über Schritt 3 (den ich mit Sicherheit auch lösen könnte) nachzudenken :-(

Ich bevorzuge PERL, aber es könnte auch andere Wege geben, falls jemand weiß, wie das geht.

Grüße aus Berlin

Christoph S.

  1. Hallo.

    Schritt 1 kriege ich problemlos hin, aber Schritt 2 klappt nicht, also ist es illusorisch, über Schritt 3 (den ich mit Sicherheit auch lösen könnte) nachzudenken :-(

    Ist das tatsächlich so schwierig oder habe ich dich nur falsch verstanden? Warum erklärst du nicht Apache, wie das Listing aussehen soll? Das Ergebnis sollte dann beliebig zu verarbeiten sein.
    MfG, at

    1. hi at,

      Warum erklärst du nicht Apache, wie das Listing aussehen soll?

      Weil der Server, auf dem alles liegt, kein Apache ist
      *g*
      Allerdings habe ich natürlich FTP-Zugang

      Grüße aus Berlin

      Christoph S.

      1. Hallo.

        Weil der Server, auf dem alles liegt, kein Apache ist

        Sondern? Kannst du auf dessen Konfiguration denn zugreifen?

        *g*

        Das wird dir schon noch vergehen ;-)

        Allerdings habe ich natürlich FTP-Zugang

        Ausschließlich FTP? Und du findest kein FTP-Programm, dessen Ausgabe sich in eine Datei umbiegen lässt?
        MfG, at

  2. Hallo,

    1. das Verzeichnislisting auf dem Server auslesen und die Dateinamen in eine zweite Liste schreiben

    aber Schritt 2 klappt nicht...

    verstehe ich jetzt aber nicht, warum so einem Programmier-Gott wie Dir das schwerfallen sollte ;)
    in PHP kann man ein Verzeichnis einfach in einer Schleife auslesen.

    Gruß, Andreas

  3. Hallo,

    Schritt 1 kriege ich problemlos hin, aber Schritt 2 klappt nicht, also ist es illusorisch, über Schritt 3 (den ich mit Sicherheit auch lösen könnte) nachzudenken :-(

    Ich bevorzuge PERL, aber es könnte auch andere Wege geben, falls jemand weiß, wie das geht.

    Was spricht gegen Net::FTP?

    Grüße
      Klaus

    1. hallo Klaus,

      Was spricht gegen Net::FTP?

      Grundsätzlich nichts. Aber der Provider hat das Modul aus Sicherheitsgründen entfernt. Ich müßte es nochmals gesondert hochladen, auf die Idee war ich bisher nicht gekommen.

      Leider bekomme ich auch keine verwertbaren logs.

      Grüße aus Berlin

      Christoph S.

      1. Moin Christoph,

        Was spricht gegen Net::FTP?
        Grundsätzlich nichts. Aber der Provider hat das Modul aus Sicherheitsgründen entfernt. Ich müßte es nochmals gesondert hochladen, auf die Idee war ich bisher nicht gekommen.

        Wofür? Du kannst das doch Problemlos von zuhause machen, oder übersehe ich da etwas?
        Mal abgesehen davon, welche Sicherheitsbedenken hat der mit Net::FTP?

        Grüße Andres Freund

        --
        ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
        1. hallo Andres,

          Du kannst das doch Problemlos von zuhause machen, oder übersehe ich da etwas?

          Es geht mir nicht primär um das Hoch- oder Runterladen von Dateien. Das würde tatsächlich "von zuhause aus" funktionieren. Ich brauche lediglich das Verzeichnislisting, das ich mit einer anderen bereits vorhandenen Liste vergleichen möchte. Die Dateien, die bei diesem Vergleich "übrigbleiben", sollen auf dem Server gelöscht werden. Ob ich die Auflistung des Inhalts eines Verzeichnisses, das auf dem Server liegt, mit einem Script "von zuhause aus" erhalten und in eine Variable oder auch in eine Textdatei speichern kann, habe ich noch nicht probiert, es müßte jedoch möglich sein. Dateien auf dem Server löschen kann ich meines Wissens nur von einem Script (oder einem FTP-Programm) aus, das auf dem Server ausgeführt wird.

          Mal abgesehen davon, welche Sicherheitsbedenken hat der mit Net::FTP?

          Details weiß ich nicht. Ich habe lediglich mitgeteilt bekommen, daß aus Sicherheitsgründen einige Module entfernt wurden, darunter eben auch FTP.

          Ich bin übrigens nicht sicher, ob ich das FTP-Modul überhaupt brauche. _Prinzipiell_ sollte mir ja ein ganze einfaches
            opendir(LISTE, "Verzeichnisname") || die;
            @inhalt=readdir(LISTE);
            closedir(LISTE);
          mein listing liefern, so daß ich mit unlink Teile des Arrays bequem löschen kann. Genau an dieser Stelle hänge ich aber. Natürlich kenne ich die nötigen Pfade, mein Forumscript kann selbstverständlich neue Dateien anlegen  -  ein Rechteproblem habe ich also nicht.

          Grüße aus Berlin

          Christoph S.

          1. Hallo,

            Ich bin übrigens nicht sicher, ob ich das FTP-Modul überhaupt brauche. _Prinzipiell_ sollte mir ja ein ganze einfaches
              opendir(LISTE, "Verzeichnisname") || die;
              @inhalt=readdir(LISTE);
              closedir(LISTE);

            Nach dem Durchlesen der ersten Absätze dieses Postings habe ich mich auch gefragt, warum Du das nicht so machst.

            mein listing liefern, so daß ich mit unlink Teile des Arrays bequem löschen kann. Genau an dieser Stelle hänge ich aber. Natürlich kenne ich die nötigen Pfade, mein Forumscript kann selbstverständlich neue Dateien anlegen  -  ein Rechteproblem habe ich also nicht.

            Jetzt bin ich verwirrt. Du hast eine Liste von Dateinamen(@inhalt), allerdings ohne Verzeichnisnamen, und irgendwo sicherlich noch eine Liste aus dem Index (oder noch besser mittels Hash). Wenn Du die Dateinamen in beiden Listen auf die gleiche Basis/Referenzverzeichnis bezogen hast, sollte der Vergleich eine leichte Übung sein.

            Grüße
              Klaus

            1. hallo Klaus,

              entschuldige, ich hätte natürlich gleich am Anfang angeben sollen, daß ich mit

              opendir(LISTE, "Verzeichnisname") || die;
                @inhalt=readdir(LISTE);
                closedir(LISTE);

              ein unverständliches Problem habe. Wenn ich "opendir" nicht kennen würde, dürftest du mich getrost auf die PERL-Kapitel in SELFHTML verweisen -> back to the roots.

              Du hast eine Liste von Dateinamen(@inhalt), allerdings ohne Verzeichnisnamen

              Das ist egal, weil es keinen Anlaß gibt, das Verzeichnis zu wechseln und das Script in _diesem_ Verzeichnis herumarbeiten soll. Die Dateien, um die es geht, liegen alle im selben Verzeichnis.

              Wenn Du die Dateinamen in beiden Listen auf die gleiche Basis/Referenzverzeichnis bezogen hast, sollte der Vergleich eine leichte Übung sein.

              Du bestätigst mir damit, daß ich immerhin auf dem richtigen Weg bin. Und wenn du das so sagst, wirds auch richtig sein. Das Dumme ist, daß ich keine logs bekomme.

              Ich glaube langsam, daß das Problem nicht bei mir liegt, sondern in irgendeiner Einstellung beim Provider (obwohl ich mir überhaupt nicht denken kann, was da verkehrt eingestellt sein könnte). Hab ihn angeschrieben und muß mal sehen, was dabei rauskommt  -  an sich haben wir ein relativ gutes kommunikatives Verhältnis.

              Grüße aus Berlin

              Christoph S.

              1. Hallo Christoph,

                entschuldige, ich hätte natürlich gleich am Anfang angeben sollen, daß ich mit

                opendir(LISTE, "Verzeichnisname") || die;
                  @inhalt=readdir(LISTE);
                  closedir(LISTE);
                ein unverständliches Problem habe.

                Und wie macht sich dieses Problem bemerkbar?

                Du hast eine Liste von Dateinamen(@inhalt), allerdings ohne Verzeichnisnamen
                Das ist egal, weil es keinen Anlaß gibt, das Verzeichnis zu wechseln und das Script in _diesem_ Verzeichnis herumarbeiten soll.

                Naja, eigentlich wollte ich nur andeuten, daß readdir() eben nur die reinen Dateinamen liefert. Es hätte ja sein können, daß Dir dieser Umstand in der Hektik der Fehlersuche nicht eingefallen ist.

                Ich glaube langsam, daß das Problem nicht bei mir liegt, sondern in irgendeiner Einstellung beim Provider (obwohl ich mir überhaupt nicht denken kann, was da verkehrt eingestellt sein könnte).

                Und dann gibt es ja immer noch Plan B, äh Plan FTP. Ich würde mir, bevor ich mich in eventuell endlose Diskussionen und Fehlersuche begebe, die Dateinamen und den Index auf meinen lokalen Rechner holen (auch wenn's vielleicht etwas holpriger ist) und dort abgleichen. Eigentlich geht's Dir, soweit ich es verstanden habe, ja nur darum, halbwegs automatisch die zu löschenden Dateien rauszufinden. Und soo oft wird dieser Abgleich ja nicht nötig sein, oder?

                Grüße
                  Klaus