Löschen Sie alle Dateien mit Ausnahme der neuesten 3 im Bash-Skript

9

Frage: Wie löscht man alle Dateien in einem Verzeichnis außer den neuesten 3?

Das Finden der neuesten 3 Dateien ist einfach:

%Vor%

Aber ich muss alle Dateien mit Ausnahme der neuesten 3 Dateien finden. Wie mache ich das, und wie lösche ich diese Dateien in der gleichen Zeile, ohne dafür eine unnötige Schleife zu machen?

Ich verwende Debian Wheezy und Bash-Skripte dafür.

    
bytecode77 05.11.2014, 19:11
quelle

6 Antworten

23

Dies listet alle Dateien mit Ausnahme der neuesten drei auf:

%Vor%

Dies wird diese Dateien löschen:

%Vor%

Dies wird auch dotfiles auflisten:

%Vor%

und lösche mit dotfiles:

%Vor%

Aber Vorsicht: Das Parsen von ls kann gefährlich sein, wenn die Dateinamen lustige Zeichen wie Zeilenumbrüche oder Leerzeichen enthalten. Wenn Sie sicher sind, dass Ihre Dateinamen keine lustigen Zeichen enthalten, ist das Parsen von ls ziemlich sicher, besonders wenn es sich um ein einmaliges Skript handelt.

Wenn Sie ein Skript zur wiederholten Verwendung entwickeln, sollten Sie die Ausgabe von ls nicht analysieren und die hier beschriebenen Methoden verwenden: Ссылка

    
lesmana 05.11.2014, 19:17
quelle
7

Das Folgende sieht ein wenig kompliziert aus, ist aber sehr vorsichtig, selbst bei ungewöhnlichen oder absichtlich bösartigen Dateinamen korrekt zu sein. Leider benötigt es GNU-Tools:

%Vor%

Erklären Sie, wie das funktioniert:

  • Find gibt <mtime> <filename><NUL> für jede Datei im aktuellen Verzeichnis aus.
  • sort -g -z führt eine allgemeine (Fließkomma-, im Gegensatz zu Integer-) numerische Sortierung basierend auf der ersten Spalte (Zeiten) durch, wobei die Zeilen durch NULs getrennt sind.
  • Der erste read in der while -Schleife entfernt die mtime (wird nicht mehr benötigt, nachdem sort fertig ist).
  • Der zweite read in der while Schleife liest den Dateinamen (läuft bis zum NUL).
  • Die Schleife inkrementiert und prüft dann einen Zähler; Wenn der Zustand des Zählers anzeigt, dass wir das erste Überspringen hinter uns haben, drucken wir den Dateinamen, der durch eine NUL begrenzt ist.
  • xargs -0 hängt dann diesen Dateinamen an die argv-Liste an, die er sammelt, um rm mit aufzurufen.
Charles Duffy 05.11.2014 19:21
quelle
5
%Vor%

Wenn Sie einen 1-Liner wollen

    
Michael Ballent 05.11.2014 19:25
quelle
2

Dies ist eine Kombination aus der Antwort von ceving und anubhava. Beide Lösungen funktionieren nicht für mich. Da ich nach einem Skript suchte, das jeden Tag laufen sollte, um Dateien in einem Archiv zu sichern, wollte ich Probleme mit ls vermeiden (jemand könnte eine lustige Namensdatei in meinem Sicherungsordner gespeichert haben). Also habe ich die genannten Lösungen an meine Bedürfnisse angepasst. Cevings Lösung löscht die drei neuesten Dateien - nicht das, was ich brauchte und gefragt wurde.

Meine Lösung löscht alle Dateien, außer die drei neuesten Dateien.

%Vor%

Einige Erklärung:

find listet alle Dateien (keine Verzeichnisse) im aktuellen Ordner auf. Sie werden mit Zeitstempeln ausgedruckt.
sort sortiert die Zeilen anhand des Zeitstempels (älteste oben).
head druckt die obersten Zeilen bis zu den letzten 5 Zeilen aus.
cut Entfernt die Zeitstempel.
xargs Läuft rm für jede ausgewählte Datei.

Damit Sie meine Lösung überprüfen können:

%Vor%

Dies erstellt 5 Dateien mit unterschiedlichen Zeitstempeln im aktuellen Ordner. Führt dies zuerst und den Code zum Löschen, um den Code zu testen.

    
Florian HY 01.12.2017 12:06
quelle
0

Dies verwendet find anstelle von ls mit einer Schwartz'schen Transformation .

%Vor%

find durchsucht die Dateien und dekoriert sie mit einem Zeitstempel und verwendet den Tabulator, um die zwei Werte zu trennen. sort teilt die Eingabe durch den Tabulator auf und führt eine allgemeine numerische Sortierung durch, die Fließkommazahlen korrekt sortiert. tail sollte offensichtlich sein und cut undecorates.

Das Problem mit Dekorationen im Allgemeinen ist, ein passendes Trennzeichen zu finden, das nicht Teil der Eingabe ist, die Dateinamen. Diese Antwort verwendet das NULL-Zeichen.

    
ceving 26.04.2017 09:58
quelle
0

Verwenden Sie nicht ls -t , da es für Dateinamen, die Leerzeichen oder spezielle globale Zeichen enthalten können, unsicher ist.

Sie können dies tun, indem Sie alle gnu -basierten Dienstprogramme verwenden, um alle bis auf 3 neueste Dateien im aktuellen Verzeichnis zu löschen:

%Vor%     
anubhava 18.07.2017 12:17
quelle

Tags und Links