
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/test
durch 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 Zeilenxargs -d '\n' rm
: übergibt jede Eingabezeile (ohne abschließende neue Zeile) als Argument anrm
.-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.