Bash-Skript zum Löschen der ältesten Dateien, aber Beibehalten der neuesten Dateien einschließlich Unterverzeichnissen

Bash-Skript zum Löschen der ältesten Dateien, aber Beibehalten der neuesten Dateien einschließlich Unterverzeichnissen

Ich versuche, alte Dateien zu löschen, sollte aber die Protokolldateien der letzten 3 Tage behalten. Ich habe den folgenden Befehl ausprobiert:

ls -tr /home/httpd/htdocs/Pfadname/Pfadname/config//build/protokolle/apps/.log | tail -n +4 | xargs rm --

aber es wurden alle Dateien gelöscht, nur 3 Dateien in einem Ordner bleiben erhalten. Aber ich möchte, dass 3 Dateien in jedem Ordner separat bleiben.

kann mir jemand helfen, dieses Problem zu lösen.

Antwort1

Sie können Folgendes versuchen: Fügen Sie den folgenden Inhalt in eine Shell-Skriptdatei ein und führen Sie diese aus.

#!/bin/bash
dirs=($(find /tmp/test -type d))
for dir in "${dirs[@]}"; do
  cd "$dir"
  ls -pt | grep -v / | tail -n +4 | xargs rm -f
done

Ersetzen Sie es /tmp/testdurch Ihren Verzeichnisnamen.

Antwort2

Sie könnten diesen Befehl verwenden:

ls -t path | sed -e '1,3d' | xargs -d '\n' rm

Oder in einer Schleife:

for d in $(find path -type d); do
  ls -t "$d" | sed -e '1,3d' | xargs -d '\n' rm
done

Wo:

  • ls -t: listet Dateien in absteigender Reihenfolge der Änderungszeit auf, ein Dateiname pro Zeile.
  • sed -e '1,3d': löscht die ersten 3 Zeilen
  • xargs -d '\n' rm: übergibt jede Eingabezeile (ohne abschließende neue Zeile) als Argument an rm.
  • -d '\n': Dies ist aus Effizienzgründen erforderlich, damit xargs jede Eingabezeile als separates Argument betrachtet, aber dennoch so viele Argumente übergibt, wie auf einmal in eine Befehlszeile passen, sodass rm nicht für jedes Argument erneut aufgerufen wird.

Weitere Möglichkeiten finden Sie im Beitrag Löschen Sie alle bis auf die aktuellsten X-Dateien in Bash.

verwandte Informationen