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?
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?
Antworten:
@Jos hat darauf hingewiesen, dass Sie ein Leerzeichen zwischen name
und verpasst haben '*.gz'
. auch für den Befehl zu beschleunigen -type f
Option 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 -- '{}' \;
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 .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 -exec
Methode.
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 rm
nur einmal am Ende ausgeführt, anstatt jedes Mal, wenn eine Datei gefunden wird, und dieser Befehl ist fast so schnell wie die Verwendung der -delete
Option, wie in modern find
:
find /path/to/ -type f -mtime +7 -name '*.gz' -delete
-delete
am Ende nicht gleich weitermachen ? Warum mit dem +
oder verwirren \;
?
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 1
verhindert , 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 -31
und 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 {} \;
name
und sollte ein Leerzeichen stehen'*.gz'
.