Dateien entfernen, die älter als 7 Tage sind

79

Ich schreibe den folgenden Befehl, um alle Dateien zu löschen, die älter als 7 Tage sind, aber es funktioniert nicht:

find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;

Wie kann ich diese Dateien entfernen?

Malihe Pakyari
quelle
5
Zwischen nameund sollte ein Leerzeichen stehen '*.gz'.
Jos

Antworten:

136

@Jos hat darauf hingewiesen, dass Sie ein Leerzeichen zwischen nameund verpasst haben '*.gz'. auch für den Befehl zu beschleunigen -type fOption Ausführen des Befehls auf f iles nur.

Der feste Befehl wäre also:

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

Erläuterung:

  • find: Der Unix - Befehl zum Auffinden f iles / d irectories / l Tinten und etc.
  • /path/to/: Das Verzeichnis, in dem die Suche gestartet werden soll.
  • -type f: finde nur Dateien.
  • -name '*.gz': Dateien auflisten, die mit enden .gz.
  • -mtime +7: Nur diejenigen mit einer Änderungszeit von mehr als 7 Tagen berücksichtigen.
  • -execdir ... \;: Führen Sie für jedes gefundene Ergebnis den folgenden Befehl in aus ....
  • rm -- '{}': entfernen Sie die Datei; Im {}Teil wird das Suchergebnis durch das Ergebnis des vorherigen Teils ersetzt. --Bedeutet, dass die Parameter für das Befehlsende verhindern, dass bei Dateien, die mit einem Bindestrich beginnen, ein Fehler angezeigt wird .

Alternativ verwenden Sie:

find /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --

Vom Mann zu finden :

-print0 
      True; print the full file name on the standard output, followed by a null character 
  (instead of the newline character that -print uses). This allows file names that contain
  newlines or other types of white space to be correctly interpreted by programs that process
  the find output. This option corresponds to the -0 option of xargs.

Welches ist ein bisschen effizienter, weil es beträgt:

rm file1 file2 file3 ...

im Gegensatz zu:

rm file1; rm file2; rm file3; ...

wie in der -execMethode.


Ein alternativer und auch schnellerer Befehl verwendet den +Terminator von exec anstelle von\; :

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +

Dieser Befehl wird rmnur einmal am Ende ausgeführt, anstatt jedes Mal, wenn eine Datei gefunden wird, und dieser Befehl ist fast so schnell wie die Verwendung der -deleteOption, wie in modern find:

find /path/to/ -type f -mtime +7 -name '*.gz' -delete
αғsнιη
quelle
3
Warum sollte ich -deleteam Ende nicht gleich weitermachen ? Warum mit dem +oder verwirren \;?
rain01
3
@ rain01 plz lies unix.stackexchange.com/q/167823/72456
αғsнιη
2

Gehen Sie beim Entfernen von Dateien mit find vorsichtig vor. Führen Sie den Befehl mit -ls aus, um zu überprüfen, was Sie entfernen

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls . Rufen Sie dann den Befehl aus dem Verlauf auf und fügen Sie ihn hinzu-exec rm {} \;

Begrenzen Sie den Schaden, den ein Suchbefehl anrichten kann. Wenn Sie Dateien aus nur einem Verzeichnis entfernen möchten, wird -maxdepth 1verhindert , dass find durch Unterverzeichnisse geht oder das gesamte System durchsucht, wenn Sie Tippfehler machen /media/bkfolder /.

Andere Grenzwerte, die ich hinzufüge, sind spezifischere Namensargumente wie das -name 'wncw*.gz'Hinzufügen einer neueren Uhrzeit -mtime -31und das Zitieren der durchsuchten Verzeichnisse. Diese sind besonders wichtig, wenn Sie Bereinigungen automatisieren.

find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;

zeke
quelle