Löschen Sie alle Dateien außer der neusten 3 in der bash-Skript
Frage: Wie löschen Sie alle Dateien in einem Verzeichnis, außer das neueste 3?
Finden Sie die neueste 3-Dateien ist einfach:
ls -t | head -3
Aber ich muss alle Dateien außer der neusten 3 Dateien. Wie mache ich das und wie lösche ich diese Dateien in der gleichen Zeile, ohne eine unnötige for-Schleife?
Bin ich mit Debian Wheezy und bash-Skripten.
InformationsquelleAutor der Frage bytecode77 | 2014-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese listet alle Dateien außer der neusten drei:
Diese wird, diese Dateien zu löschen:
Wird auch diese Liste dotfiles:
löschen und mit dotfiles:
Aber Vorsicht: parsing
ls
können gefährlich sein, wenn die Dateinamen enthalten komische Zeichen, wie Zeilenumbrüche oder Leerzeichen. Wenn Sie sicher sind, dass Sie die Dateinamen enthalten nicht die lustigen Charaktere, die diese dann analysierenls
ist ziemlich sicher, umso mehr, wenn es eine Zeit nur Skript.Wenn Sie entwickeln ein Drehbuch für die wiederholte Verwendung, dann sollten Sie sicherlich nicht Parsen der Ausgabe von
ls
und verwenden Sie die hier beschriebenen Methoden: http://mywiki.wooledge.org/ParsingLsInformationsquelleAutor der Antwort lesmana
Folgenden sieht ein bisschen kompliziert aus, aber ist sehr vorsichtig, um korrekt zu sein, auch mit ungewöhnlichen oder absichtlich schädliche Dateien. Leider, es erfordert GNU-tools:
Erklären, wie es funktioniert:
<mtime> <filename><NUL>
für jede Datei im aktuellen Verzeichnis.sort -g -z
hat eine Allgemeine (floating-point, im Gegensatz zu Ganzzahl) numerische Sortierung nach der ersten Spalte (mal) mit den Zeilen, getrennt durch NULs.read
imwhile
Schleife Streifen aus der mtime (nicht mehr benötigt nachsort
getan ist).read
imwhile
- Schleife liest die Dateinamen (bis NULL).xargs -0
dann hängt das mit dem Namen in der argv-Liste es ist zu sammeln, um aufrufenrm
mit.InformationsquelleAutor der Antwort Charles Duffy
Wenn Sie wollen ein 1 liner
InformationsquelleAutor der Antwort Michael Ballent
Dies ist eine Kombination von ceving und anubhava Antwort.
Beide Lösungen sind nicht für mich arbeiten. Weil ich war auf der Suche nach einem Skript, das ausgeführt werden soll, die jeden Tag für die Sicherung von Dateien in einem Archiv, das wollte ich vermeiden, Probleme mit
ls
(könnte jemand gespeichert haben ein paar lustige Namen die Datei in meinem backup-Ordner speichern). Also modifizierte ich die erwähnten Lösungen zu meinen Anforderungen passen.Ceving ist soltution löscht die drei neuesten Dateien - nicht das was ich gebraucht habe und gefragt wurde.
Meine Lösung löscht alle Dateien, außer die drei neuesten Dateien.
Einige Erklärungen:
find
listet alle Dateien (nicht Verzeichnisse) im aktuellen Ordner. Sie sind gedruckt mit Zeitstempel.sort
sortiert die Zeilen basierend auf Zeitstempel (älteste oben).head
Drucke aus den top-Linien, bis zu den letzten 3 Zeilen.cut
löscht den Zeitstempel.xargs
läuftrm
für jede ausgewählte Datei.Für Sie, um zu überprüfen, meine Lösung:
Diese schafft 5 Dateien mit unterschiedlichen Zeitstempeln in den aktuellen Ordner. Führen Sie diese ersten und der code zu löschen um den code zu testen.
InformationsquelleAutor der Antwort flohall
Nicht verwenden
ls -t
wie ist es riskant für Dateinamen enthalten Leerzeichen oder spezielle glob-Zeichen.Können Sie dies tun, indem Sie alle
gnu
basierte Dienstprogramme zu löschen, aber alle 3 neuesten Dateien im aktuellen Verzeichnis:InformationsquelleAutor der Antwort anubhava
In zsh:
Wenn dotfilesersetzen Sie die eingeklammerten Teil mit
(Om[1,-4]D)
.Ich denke, diese funktioniert einwandfrei mit beliebigen Zeichen in den Dateinamen (gerade überprüft mit Zeilenumbruch).
Erklärung: Die Runden Klammern enthalten Glob-Qualifier.
O
bedeutet "order by descending",m
bedeutet mtime (Sieheman zshexpn
für andere Sortier-Tasten - großes manpage; - Suche nach "sortiert").[1,-4]
gibt nur die Spiele auf eins basierenden Indexposition 1 (Letzte + 1 - 4) (Hinweis: die-4
für das löschen alle, aber 3).InformationsquelleAutor der Antwort FunctorSalad
Diese verwendet
find
stattls
mit einem Schwartzian verwandeln.find
durchsucht die Dateien und schmückt Sie mit einem Zeitstempel und verwendet den tabulator zur Trennung der beiden Werte.sort
spaltet Sie die Eingabe mit der tabulator-und führt eine Allgemeine numerische Sortierung, die Art floating-point-zahlen korrekt.tail
sollte offensichtlich sein, und diecut
undecorates.Das problem mit Dekorationen im Allgemeinen ist die Suche nach einem geeigneten Trennzeichen, die nicht Teil der Eingabe, Datei-Namen. Diese Antwort verwendet, die NULL-Zeichen.
InformationsquelleAutor der Antwort ceving