Bash Script um Ordner zu löschen

  • Erst mal ein frohes neues Jahre an alle :)

    Ich bin gerade dabei und versuche auf unserem Linux Server bestimmte Dateien per Script zu löschen, allerdings komme ich gerade einfach nicht weiter.
    Zur Erklärung ich habe etwa 50.000 Ordner, die aufsteigend nummeriert sind. Nun möchte ich alle Ordner von 0-45.000 auflisten und ausgeben und anschließend löschen
    Ich habe das ganze mit find versucht, komme aber einfach nicht weiter. Vielleicht ist hier jemand so lieb und kann mit kurz auf die Sprünge helfen

    :)


    Hier mein bisheriger Versuch:

    find /mnt/Pool_1/Daten/DB_Archiv/Daten/DB_Archiv -name *45000 -type d -maxdept 1 -print > /mnt/Pool_1/Daten/Ordner_alt-d.csv


    Liebe Grüße

    Marius

  • Gibt es dort noch andere Ordner als die 0-45k?


    Du könntest drum herum mal mit einer Schleife experimentieren:

    Code
    for i in {0..45000}; do echo "$i"; done

    (Nur ein Beispiel mit " echo"! Je nachdem wie sie nummeriert sind, brauchst Du vielleicht noch ein "printf".)


    Ich würde mir die Ordnerstruktur übrigens noch einmal überlegen. So viele Dateien oder Ordner in einem Verzeichnis wirken sich sehr schnell negativ auf die Performance aus.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Wenn du mit deinem find löschen möchtest, benötigst du ein -deleteoder -exec rm {} \; je nachdem welche find Version vorhanden ist.

    Das ganze ist natürlich auf eigene Gefahr!


    Was mir aber jetzt gerade im nachhinein auffällt, was funktioniert den aktuell nicht?

  • KB19

    Nein, dort gibt es nur Ordner von 0-50k.


    Die Ordner sind nach folgendem Schema benannt:
    Text,Text#45000
    Ich habe bisher noch nie mit Schleifen gearbeitet.. kannst du mir vielleicht noch nen Tipp geben, wie ich die schleife in meinem Beispiel, am besten anwende?

    Ich weiß, dass die Ordner Struktur momentan mehr als beschissen ist, deswegen bin ich gerade dabei alte Ordner zu löschen. Inzwischen gibt es eine neue Ordner Struktur.


    Skulduggery Ja das weiß ich. Ich möchte aber erst mal alle Ordner in einer .csv ausgeben, um zu überprüfen ob auch wirklich alles richtig gefunden wurde.
    Danach würde ich noch mal ein Script mit "-exec rm" ausfrühren.


    Ich kann zwar einzelne Ordner auflisten, aber nicht alle Ordner von 0-45k. Und genau da komme ich nicht weiter..

  • was spricht gegen:

    rm -rf /mnt/Pool_1/Daten/DB_Archiv/Daten/DB_Archiv/Text,Text#*

    ?

    ACHTUNG DER BEFEHL LÖSCHT SOFORT UND WIRKLICH!!!!

    Dass der Befehl alles löscht?

    Meine Minecraft-Plugins auf SpigotMC (Open Source): www.spigotmc.org/members/mfnalex.175238/#resources

    Discord: discord.jeff-media.com

  • Ich habe es jetzt soweit gebracht, dass ich nur noch die Zahlen nach dem # ausgebe.

    Allerdings fehlt mir jetzt noch die Bedingung, dass er nur die Zahlen zwischen 0-45k ausgibt..


    ###!/bin/bash

    for i in /mnt/Pool_1/Daten/DB_Archiv/Daten/DB_Archiv/*; do prefix="${i##*#}"; done;

  • Probier mal etwas in dieser Art:

    Bash
    for i in ./path/foo/bar/*,*#{0..45000}
    do
        if [[ -e "$i" ]]
        then
            echo "${i##*#}"
        fi
    done

    Wenn die Ordner wirklich dieses Format haben, müsste das hinhauen.


    (Pfad vorne bitte selber ergänzen und statt echo halt das, was wirklich passieren soll.)


    PS: https://sipb.mit.edu/doc/safe-shell/

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Oder mit zsh (der Z-Shell):

    Auflisten:

    Code
    zargs -- /mnt/Pool_1/Daten/DB_Archiv/Daten/DB_Archiv/Text\#<0-45000>*/**/*(od) -- printf '%s\n'

    Löschen:

    Code
    zargs -- /mnt/Pool_1/Daten/DB_Archiv/Daten/DB_Archiv/Text\#<0-45000>*/**/*(od) -- rm -rf

    Die Option "od" sorgt dafür, dass im Dateibaum zuerst in die Tiefe gegangen wird.