Ich suche nach einem Bash-Skript, das in eine Liste von Verzeichnissen aufgenommen wird und alle bis auf die vier zuletzt erstellten Dateien löscht.
Wie kann ich das machen?
linux
bash
bash-scripting
Marv1n
quelle
quelle
Antworten:
Entfernen
echo
Sie das gewünschte Ergebnis, wenn Sie zufrieden sind.Wenn Sie Dateinamen mit Leerzeichen haben, ist mehr Arbeit erforderlich.
quelle
sed '1,4d'
mittail -n +5
.ls
?Möchten Sie die vier neuesten Dateien in jedem Verzeichnis oder die vier neuesten Dateien in JEDEM Verzeichnis behalten?
Um das erste Problem zu lösen, verwenden Sie find, um jedes Verzeichnis aufzulisten, und entfernen dann in jedem Verzeichnis alle bis auf die vier neuesten Dateien. Das ist nicht zu schwer.
Die Lösung des zweiten Problems erfordert etwas mehr Überlegungen, ist aber tatsächlich einfacher zu schreiben.
Grundsätzlich finden Sie jede Datei rekursiv. Rufen Sie den Befehl "stat" auf und geben Sie die Änderungszeit und den Namen der Datei zurück. Sortieren Sie diese absteigend numerisch und überspringen Sie die ersten vier Dateien, die die neuesten sind.
Entfernen Sie dann die führenden Zeitstempel und die resultierende Liste der Dateinamen.
So etwas wie (ungetestet):
Dies sollte funktionieren, obwohl Sie das 'Echo' in der while-Schleife entfernen möchten, um es effektiv zu machen. Testen Sie es zuerst sorgfältig!
quelle
Mir ist klar, dass dies nicht ganz das ist, wonach Sie fragen, aber für diese Art der Sicherung ziehe ich es vor, die Protokolldateien zu drehen, bevor Sie die neue erstellen. Es ist etwas expliziter und viel einfacher zu codieren:
quelle
Dieser Befehl sollte funktionieren
Wenn Sie nicht möchten, dass der Befehl Dateien rekursiv löscht, fügen Sie die Option
-maxdepth 1
zuvor hinzu-type f
Der Befehl druckt rekursiv jede Datei mit ihrem letzten Änderungsdatum (
find PATH1 PATH2 PATH3 -type f -printf '%T@ %p\n'
), sortiert die Liste nach Datum (sort -nr
) und überspringt dann die ersten vier Einträge (tail -n+5
). Schließlich wird die Zeitinformation gelöscht (cut -f 2- -d " "
) und das Ergebnis anschließend an xargs übergeben, das den entsprechenden Befehl rm generiert und ausführt.quelle
Die einfachste Methode:
quelle