So löschen Sie X Anzahl der Dateien in einem Verzeichnis

Sich um die X Anzahl der Dateien in einem Verzeichnis, das ich tun kann:

$ ls -U | head -40000

Wie würde ich dann löschen Sie diese 40.000 Dateien? Zum Beispiel, etwas wie:

$ "rm -rf" (ls -U | head -40000)
  • Hinweis für andere, dass die -U option ls in diesem Beispiel wird die Rückkehr Verzeichnisinhalt unsortiert (so wie Sie sind „nativ“ gespeichert). Es wird auch nicht zeigen dot-Dateien. Möchten Sie vielleicht eine andere option, je nach Ihren Bedürfnissen.
  • Hoffen, dass Sie nicht über Zeilenumbrüche in Ihren Dateinamen, mit, dass der erste Befehl.
InformationsquelleAutor David542 | 2016-02-24



4 Replies
  1. 3

    Dem Werkzeug, das Sie dazu brauchen, ist xargs. Es wird konvertieren Sie standard-Eingabe in Argumente zu einem Befehl, den Sie angeben. Jede Zeile der Eingabe behandelt wird, als ein einziges argument.

    So etwas wie dies funktionieren würde (siehe den Kommentar unten, obwohl ls sollte nicht analysiert werden, auf diese Weise in der Regel):

    ls -U | head -40000 | xargs rm -rf
    

    Ich würde empfehlen, bevor Sie versuchen, diese zu beginnen mit einer kleinen head Größe und Nutzung xargs echo drucken den Dateinamen übergeben, so dass Sie verstehen, was Sie zu löschen.

    Bewusst sein, wenn Sie Dateien mit seltsamen Zeichen, dass dies manchmal ein problem sein. Wenn Sie auf ein modernes GNU-system wenn Sie möchten, kann die Argumente, die für diese Befehle, die mit null-Zeichen zu trennen, jedes element. Da ein Dateiname nicht enthalten, eine null-Charakter, das wird sicher analysieren alle möglichen Namen. Ich bin mir nicht bewusst Sie eine einfache Möglichkeit, die top – X Elemente, wenn Sie gleich null sind, getrennt.

    So, zum Beispiel, können Sie diese verwenden, um das löschen aller Dateien in einem Verzeichnis

    find . -maxdepth 1 -print0 | xargs -0 rm -rf
    
    • Parsen ls ist ein antipattern ist und vermieden werden sollte in jedem automation. (Ich weiß, das war in der Frage, aber die Leser sind wahrscheinlich zu überspringen und direkt zur Antwort.)
    • Wahr. Aktualisiert die Antwort haben, die Warnung bevor ich mit ls
  2. 2

    Verwenden, ein bash-array und in Scheiben schneiden. Wenn die Anzahl und Größe der Argumente ist wahrscheinlich zu nah an die Grenzen des Systems, können Sie immer noch xargs zum aufteilen der Rest.

    files=( * )
    printf '%s\0' "${files[@]:0:40000}" | xargs -0 rm
    
    • Haben Sie getestet, die mit 40.000 Dateinamen mit beliebiger Länge? Denken Sie rm verbrauchen kann 40.000 Argumente?
    • Nein. Wie soll ich produzieren-Namen mit beliebiger Länge? Ernsthaft, ich konnte es testen, und es könnte hier zu arbeiten, weil ich eine bestimmte Implementierung exec, und konnte es immer noch nicht für eine OP, die vielleicht eine andere haben. Auf OS X, ist ARG_MAX ~264k.
    • Nein, das (a) nicht funktionieren und b) selbst wenn es funktionieren würde, auf ein zukünftiges system würde es nie skalieren. Ich glaube nicht, wan ‚ T, um das smart-ass, aber das ist einfach die Wahrheit. Btw, ich sollte einfach „maximal“ statt „beliebiger“ Länge vor.
    • in welchem Sinne wäre es nicht skalieren?
    • Ich meine-shell-Variablen haben eine begrenzte Kapazität. Auch die maximale Länge einer Kommandozeile ist begrenzt. Auch wenn die kommenden Betriebssysteme Erhöhung dieser Grenze beschränkt. Fazit: Man kann nicht speichern, die in einer bash-variable, Sie kann nicht rufen Sie rm nur einmal. (Ich meine zuverlässig). Du musst es so oft wie notwendig, sämtliche Argumente, die stets die mögliche Anzahl der Argumente darf nicht auf den Charakter beschränken. Eigentlich ist dies war xargs tut 😉
    • danke, ich habe rollte xargs in meiner Antwort, aber ich denke immer noch die shell-variable slicing ist ein guter Ansatz.
    • OK. Eigentlich bin ich nicht sicher mehr über ein limit in der Größe der bash-Variablen. Werden müssen, um das zu untersuchen,.
    • href=“https://stackoverflow.com/questions/1078031/what-is-the-maximum-size-of-an-environment-variable-value/1078125#1078125″ title=“was ist die maximale Größe einer environment-variable mit dem Wert“>stackoverflow.com/questions/1078031/…
    • Ich gebe dir ein upvote auf dieses, da es ist ziemlich einfach, und wie lange, wie mein test zeigt, dass es funktionieren kann mit 40.000[0000…] mit Dateinamen ohne ein problem, wie es scheint auf den ersten Blick. Ich bin noch nicht sicher wenn es ist der richtige Weg, aber zumindest für 40.000 Dateien sollte es ok sein. (Ich auf jeden Fall unterschätzt, dass)
    • fwiw ich habe ein flüchtiger test mit 80001-Dateien mit dem Namen {0..80000}. (Es dauerte viel länger, um Sie zu erstellen, als Sie zu löschen.)

  3. 2

    Was über die Verwendung von awk als filter?

    find "$FOLDER" -maxdepth 1 -mindepth 1 -print0 \
        | awk -v limit=40000 'NR<=limit;NR>limit{exit}' RS="\0" ORS="\0" \
        | xargs -0 rm -rf
    

    Wird es zuverlässig entfernen, höchstens 40.000 Dateien (oder Ordner). Zuverlässig bedeutet, dass unabhängig davon, welche Zeichen im Dateinamen enthalten kann.


    Btw, um die Anzahl der Dateien in einem Verzeichnis zuverlässig können Sie tun:

    find FOLDER -mindepth 1 -maxdepth 1 -printf '.' | wc -c 
    
    • Fairer Punkt! Bearbeitete, dass
  4. 0

    Landete ich mache das seit meinem Ordner benannt wurden, mit fortlaufenden Nummern. Dies sollte auch für die alphabetische Ordner:

    ls -r releases/| sed '1,3d' | xargs -I {} rm -rf releases/{}
    

    Details:

    • Liste alle Elemente in der releases/ Ordner in umgekehrter Reihenfolge
    • schneiden Ihnen die ersten 3 Elemente (das wäre das neueste, wenn numeric/alpha-naming)
    • für jedes Element rm es

    In Ihrem Fall, können Sie ersetzen Sie ls -r mit ls -U und 1,3d mit 1,40000d. Das sollte der gleiche sein, glaube ich.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.