![Nur Dateien löschen, die älter als 7 Tage sind: -mtime und find](https://rvso.com/image/134439/Nur%20Dateien%20l%C3%B6schen%2C%20die%20%C3%A4lter%20als%207%20Tage%20sind%3A%20-mtime%20und%20find.png)
Habe ein paar ähnliche Fragen gefunden, die aber nicht ganz passten.
Ich habe ein Verzeichnis für Backups (SQL) und möchte alle Dateien in diesem Verzeichnis löschen, die älter als 7 Tage sind, wobei alle Unterverzeichnisse intakt bleiben sollen.
Das ist, was ich habe:
find /var/log/mbackups -mtime +7 -type f -delete
Ist dies der richtige Weg, um mein Ziel zu erreichen?
Antwort1
Ihr Befehl durchsucht das Verzeichnis der obersten Ebene /var/log/mbackups
und durchsucht auch alle Unterverzeichnisse. Dabei werden Dateien gelöscht, die das Sieben-Tage-Kriterium erfüllen. Die Verzeichnisse selbst werden nicht gelöscht.
Wenn Sie möchten, dass ein Befehl nur Dateien im Verzeichnis anzeigt /var/log/mbackups
undnicht in Unterverzeichnisse absteigenmüssen Sie diese Einschränkung hinzufügen:
find /var/log/mbackups -maxdepth 1 -mtime +7 -type f -delete
Im Allgemeinen können Sie den find
Befehl testen, indem Sie die -delete
Aktion durch etwas Harmloses ersetzen, wie -print
(Sie benötigen -depth
hier auch, wie -delete
impliziert -depth
):
find /var/log/mbackups -depth -mtime +7 -type f -print
Antwort2
Mit zsh:
rm -f /var/log/mbackups/*(.m+6)
gleich wie:
rm -f /var/log/mbackups/*(.^m-7)
Würde die regulären (mit .
) Dateien entfernen, die nicht versteckt sind und in den letzten 7 Tagen nicht geändert wurden. Wie bei find
's -mtime +7
würde m+7
auf Dateien zutreffen, deren Alter, abgerundet auf die nächste Ganzzahlzahl von Tagen, strikt größer als 7 ist, würde also auf Dateien zutreffen, die 8 Tage oder älter sind (eine häufige Falle bei der Arbeit mit find
).
Um auch alte versteckte Dateien zu entfernen, fügen Sie den D
Glob-Qualifizierer hinzu.
Wenn keine passende Datei vorhanden ist, erhalten Sie eine Fehlermeldung. Sie können dies vermeiden, indem Sie den N
Glob-Qualifizierer hinzufügen (und rm
wird dann ohne Dateinamenargument aufgerufen, -f
sollte sich aber mit nicht beschweren).
Antwort3
Haftungsausschluss: Ich bin der aktuelle Autor von rawhide (rh) (siehehttps://github.com/raforg/rawhide)
Fast. Es ist sehr nah dran. Die korrekte Version Ihres Versuchs lautet:
find /var/log/mbackups -maxdepth 1 -mtime +6 -type f -delete
Wenn Sie findenfindenDas -mtime
Prädikatsargument ist nicht ausreichend intuitiv, man könnteRohleder(rh) stattdessen:
rh -UUU -r /var/log/mbackups 'f && old(7*days)'
-UUU
hebt die Verknüpfung auf/entfernt/löscht Übereinstimmungen.
-r
ist wiefindenund -mindepth 1 -maxdepth 1
sucht nur genau eine Ebene unterhalb des Suchpfads bzw. der Suchpfade, Unterverzeichnisse werden also nicht durchsucht.
f
stimmt mit regulären Dateien überein.
old(7*days)
stimmt mit Dingen überein, die zuletzt vor mindestens 7 Tagen geändert wurden.
Antwort4
Warnung: -delete
ist nicht standardisiert (nicht portierbar) und die Verwendung birgt Risiken gfind
.
Beachten Sie, dass rm
es einige Sicherheitsbeschränkungen gibt, aber die gfind
Manpage erwähnt solche Beschränkungen nicht -delete
. Ich empfehle daher, die offizielle Methode zu verwenden:
find /var/log/mbackups -mtime +7 -type f -exec rm {} +
Dies ist nicht einmal langsamer als die nicht standardmäßige Methode mit -delete
.