PowerShell: Alle Dateien außer die 10 neuesten löschen

Heute hatte ich die Aufgabe, mit einem Script aus einem Ordner alle Dateien außer die 10 neuesten zu löschen. Kein Problem für die PowerShell:

$allFiles = dir *.* | ? { -not $_.PSIsContainer } | sort LastWriteTime -descending $keepFiles = $allFiles | select -first 10 $allFiles | ? { $keepFiles -notcontains $_ } | % { del $_ -whatIf }

Aber irgendwie kommt mir das zu lang vor, für eine solche Aufgabe… kennt noch jemand eine einfachere (bzw. kürzere) Lösung?

Über Stefan

Polyglot Clean Code Developer

7 Kommentare

  1. nicht einfacher doch kürzer und nur eine loop.

    $allFiles = dir *.* |? {! $_.PSIsContainer } | sort LastWriteTime
    del $allFiles[0..($allfiles.count-11)] -whatif

    Greetings MOW

  2. @mow: Sehr schön, danke! Da habe ich wohl schon zu kompliziert gedacht 🙂

  3. Einfacher mit der Unix-Shell:

    ls -t | tail +11 | xargs rm -f

    Gruß
    Markus

  4. @Markus: Dein Script löscht aber auch alle Dateien, wenn es z.B. nur 5 im Ordner gibt, oder sehe ich das falsch? Und das wäre nicht so gut 😉

  5. Moin Stefan,

    tail +11 zeigt alle Zeilen nach der 10 Zeile. Wenn es weniger sind, dann wird nichts ausgegeben.
    Beispiel:
    $ ls
    file1 file2 file3 file4 file5 file6 file7 file8 file9

    user@PC /cygdrive/c/tmp/test
    $ touch file10 file11 file12

    user@PC /cygdrive/c/tmp/test
    $ ls -t | tail +11
    file1
    file2

    Gruß
    Markus

  6. Hallo Stefan,
    bin zwar spät, habe aber auch noch einen Vorschlag:

    dir *.* | ? {!$_.psiscontainer} | sort LastWriteTime -desc
    | select -skip(10) | del

    Gruß

    hma

  7. Hallo hma,

    funktioniert gut allerdings löscht deine Variante die 10 aktuellsten wenn die Sortierung “desc” ist
    Wer die 10 aktuellsten behalten will sollte “-desc” einfach weglöschen

Schreibe einen Kommentar

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

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax