Nur Dateien löschen, die älter als 7 Tage sind: -mtime und find

Nur Dateien löschen, die älter als 7 Tage sind: -mtime und find

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/mbackupsund 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/mbackupsundnicht 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 findBefehl testen, indem Sie die -deleteAktion durch etwas Harmloses ersetzen, wie -print(Sie benötigen -depthhier auch, wie -deleteimpliziert -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 +7würde m+7auf 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 DGlob-Qualifizierer hinzu.

Wenn keine passende Datei vorhanden ist, erhalten Sie eine Fehlermeldung. Sie können dies vermeiden, indem Sie den NGlob-Qualifizierer hinzufügen (und rmwird dann ohne Dateinamenargument aufgerufen, -fsollte 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 -mtimePrädikatsargument ist nicht ausreichend intuitiv, man könnteRohleder(rh) stattdessen:

rh -UUU -r /var/log/mbackups 'f && old(7*days)'

-UUUhebt die Verknüpfung auf/entfernt/löscht Übereinstimmungen.

-rist wiefindenund -mindepth 1 -maxdepth 1sucht nur genau eine Ebene unterhalb des Suchpfads bzw. der Suchpfade, Unterverzeichnisse werden also nicht durchsucht.

fstimmt mit regulären Dateien überein.

old(7*days)stimmt mit Dingen überein, die zuletzt vor mindestens 7 Tagen geändert wurden.

Antwort4

Warnung: -deleteist nicht standardisiert (nicht portierbar) und die Verwendung birgt Risiken gfind.

Beachten Sie, dass rmes einige Sicherheitsbeschränkungen gibt, aber die gfindManpage 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.

verwandte Informationen