Entfernen Sie alle Dateien, die vor einem bestimmten Datum erstellt wurden

26

Ich habe ein Verzeichnis mit einer großen Anzahl von Dateien (wie Protokolle für jeden Tag des Jahres). Ich möchte alle Dateien entfernen, die vor 22/11 erstellt wurden. Wie kann ich das erreichen? Muss ich finddann exec verwenden -rm? Ich benutze ksh.

user1058398
quelle
1
Die übliche Einschränkung ist, dass Unix-Dateisysteme im Allgemeinen keine Aufzeichnungen darüber enthalten, wann die Datei erstellt wurde - nur die Zeiten, zu denen der Inode und der Inhalt zuletzt geändert wurden, sind verfügbar.
Toby Speight

Antworten:

35

Verwenden findist weiterhin die bevorzugte Methode zum Löschen von Dateien. Weitere Informationen finden Sie unter http://mywiki.wooledge.org/UsingFind .

Eine Möglichkeit besteht darin, eine Datei mit dem Zeitstempel darin zu erstellen. z.B

touch -t 201311220000 /tmp/timestamp

Löschen Sie nun die Dateien GNU find(vorausgesetzt im aktuellen Verzeichnis), die dem Zeitstempel entsprechen, zB:

find . -type f ! -newer /tmp/timestamp -delete  

oder nicht GNU finden

find . -type f ! -newer /tmp/timestamp -exec rm {} \;
Valentin Bajrami
quelle
2
Was ist damit? Funktioniert es ? find -type f -mtime +5 -exec rm -f {} \;
user1058398
1
@ user1058398 Damit werden Dateien gelöscht, die älter als 5 Tage sind.
Valentin Bajrami
Löscht es auch Ordner zusammen mit Dateien? @ val0x00ff
alper
1
@Avatar nein, da dies die type -fAktion nur auf die Dateien beschränkt.
Valentin Bajrami
22

Mit GNU oder einigen BSDs find:

find . ! -newermt 2013-11-22 ! -type d -delete

Beachten Sie, dass der letzte Änderungszeitpunkt der Dateien überprüft wird. Auf einigen BSDs, können Sie -newerBtanstelle von -newermtder Datei inode überprüfen Geburt Zeit statt , falls verfügbar.

Stéphane Chazelas
quelle
1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

Beispiel:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

In diesem Fall werden alle Dateien, die mit "ORA_XEO" beginnen, mit mehr als 15 Tagen gelöscht.

calafate
quelle
Obwohl es besser mit der Uhr rm -rfwürde der erste Befehl alles entfernen in allen Verzeichnissen , die älter sind als die 15 Tage. (Auch, warum die Klammer herum -name?)
ilkkachu
Du hast recht, wir müssen nicht "(" ")" setzen.
Calafate
Aber wenn wir eine Bedingung hinzufügen wollen, kann dies nützlich sein. Zum Beispiel, wenn wir alle Dateien entfernen möchten, die mit ".jar" oder ".cp" enden und mit "ex" beginnen. example.jar- es wird entfernt example.cp- es wird entfernt example.tar- es wird nicht entfernt
calafate
In diesem Fall können wir find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
Folgendes
Dadurch werden einige Dateien aus der Liste <Anzahl der Tage> entfernt und nicht alle Dateien, die älter als <Anzahl der Tage> sind, es sei denn, Sie führen sie genau um Mitternacht aus und sie ist innerhalb einer Sekunde abgeschlossen. Bei GNU findsollten Sie den -daystartModifikator verwenden, um den -mtimeWert auf Mitternacht zu setzen.
Roaima