Kalle_B: Linux: Dateien löschen (zu viele)

Hallöle,

wollte kürzlich Dateien löschen, die von PHP automatisch angelegt werden.

Es waren aber zu viele, das Kommando rm *.* brach ab. Es könnten wohl zehntausende sein.

Gibt es eine Möglichkeit, nacheinander 1000 oder 5000 Dateien zu löschen, von denen der Name nicht bekannt ist?

Kalle

  1. Hallo Kalle,

    das Problem ist, dass die Shell den * auflöst, bevor das rm ausgeführt wird.
    Beispiel:
    Es gibt die folgenden Dateien:
    a
    b
    c

    ein rm * wird dann zu
    rm a b c
    aufgelöst und dann erst ausgeführt

    Ein Lösungsansatz wäre es, eine kleine for-Schleife zu schrieben:

    cd Ordner
    for i in ls -1
    do
      rm ${i}
    done

    Alternativen wären xargs oder find

    Gruß,
    the-FoX

    1. Hallo Fox,

      cd Ordner
      for i in ls -1
      do
        rm ${i}
      done

      Das sieht erstmal gut aus, aber nach einer Denkpause wird angefragt, ob die schreibgeschützte Datei gelöscht werden soll. Und dann die nächste.

      Wie sieht das Kommando aus, wenn alle gelöscht werden sollen?

      Kalle

      1. Hallo Kalle,

        gib dem rm Kommando den Parameter -f mit, dann wird nicht mehr gefragt, sondern gnadenlos gelöscht.

        Die anderen Alternativen wie Löschen des Ordners oder find und xargs wären wie gesagt die andere Lösung. Wenn tatsächlich der gesamte Ordner gelöscht werden kann, würd ich Dir empfehlen den Ordner mittels rm -rf zu löschen, was deutlich schneller gehen sollte.

        Gruß,
        the-FoX

        1. Hallo Fox,

          vor deiner Antwort bin ich auf die glorreiche Idee gekommen, die do- Schleife als root auszuführen.

          Jetzt fragt er (DER Linux?) zwar nicht, meldet sich seit 20 min aber auch nicht zurück. Na, mal sehen ...

          Kalle

          1. Hallo Fox,

            Jetzt fragt er (DER Linux?) zwar nicht, meldet sich seit 20 min aber auch nicht zurück. Na, mal sehen ...

            Wollte mit [Strg] [C] abbrechen, da kam die Meldung, dass das Netz getrennt wurde. Hätte ich ja noch 10 Std. warten können.

            Aber die Dateien sind weg, bis auf ein paar dutzend, die in den letzten Minuten schon wieder neu dazugekommen sind.

            Danke dir.

            Kalle

          2. Moin!

            Du hast also Rechte am Verzeichnis, aber keine Schreibrechte an den Dateien.

            vor deiner Antwort bin ich auf die glorreiche Idee gekommen, die do- Schleife als root auszuführen.

            Das ist quasi die ideale Idee um bei einem Fehler das gesamte System zu zerstören.

            Wenn Du Root werden kannst, dann kannst Du auch zum Eigentümer der Datei werden oder deren Rechte neu setzten

            Variante 1:
            Das Kommando yes sendet ein y oder den als Argument übergeben String. Das ist spaßig, weil ein yes no bis zum Abbruch mit STRG+C immer zu "no" sendet. Du kannst aber das y durch eine Pipe umleiten:

            for i in `ls -1`; do  
               yes | rm $i;  
            done
            

            Bessere Variante 2:

            in der Hilfe zum Befehl  rm (man 1 rm) steht
            -f, --force  Ignorieren nicht vorhandener Dateien, keine Nachfragen.

            Theoretisch könnte eine Datei mit einem '-' oder zweien davon beginnen ('--') oder deren Name nur so ('-', '--') lauten. Dann soll die Variante gewählt werden dass ein '--' als "letzte Option" gesetzt wird, was danach folgt wird immer als Parameter (hier Dateinamen) behandelt. Bei unbekannten Dateinamen die ein führendes '-' enthalten können ist das "erste Bürgerpflicht".

            Mein Vorschlag also:

            for i in `ls -1`; do  
               rm --force -- $i;  
            done
            

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

  2. Es waren aber zu viele, das Kommando rm *.* brach ab. Es könnten wohl zehntausende sein.

    Definiere "brach ab" - bei mir ist noch nie ein Shell-Kommando wegen zu langer Laufzeit abgebrochen.

    Gibt es eine Möglichkeit, nacheinander 1000 oder 5000 Dateien zu löschen, von denen der Name nicht bekannt ist?

    rm -rf * löscht dir, im root-Verzeichnis ausgeführt, beinhalt alles - egal wie lange es dauert - naja zumindest so lange, bis sich das OS selbst eliminiert hat ;)

    Wenn du aber meinst, kanns du vorher eine Dateiliste erstellen und rm damit füttern.

    1. Moin Moin!

      find /irgend/wo/im/dateisystem -name '*.muell' -or -name '*.schrott' -print0 | xargs -0 rm

      Erklärung: find erzeugt eine Liste, schreibt diese nach STDOUT, getrennt mit ASCII NUL, das garantiert nicht in Dateinamen vorkommen kann. xargs liest von STDIN, trennt an ASCII NUL, und ruft rm so lange mit einem "kleinen" Päckchen von Dateien auf (jeweils so viele, wie das Betriebssystem erlaubt), bis find nichts mehr liefert.

      Und weil ich die Kombination find ... -print0 | xargs -0 programm ... so oft brauche, habe ich mir einen kleinen Wrapper gebastelt, der beides in einen Aufruf packt (findx ... -- programm ...).

      Wenn die Dateien zu löschenden Dateien alle in einem Verzeichnis und dessen ggf. Unterverzeichnissen liegen, und dort ABSOLUT nichts anderes liegt, kann man das Verzeichnis samt Inhalt und Unterverzeichnissen per rm -rf /irgend/wo/im/dateisystem/schrott löschen.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".