So löschen Sie Dateien, die älter als X Stunden sind

191

Ich schreibe ein Bash-Skript, das alte Dateien löschen muss.

Es wird derzeit implementiert mit:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

Dadurch werden die Dateien gelöscht, die älter als 1 Tag sind.

Was ist jedoch, wenn ich an diesem Tag eine feinere Auflösung benötige, beispielsweise 6 Stunden alt? Gibt es eine schöne, saubere Möglichkeit, wie es find und -mtime verwendet?

Tom Feiner
quelle

Antworten:

303

Hat Ihr finddie -mminOption? Auf diese Weise können Sie die Anzahl der Minuten seit der letzten Änderung testen:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

Oder schauen Sie sich vielleicht an, tmpwatchwie Sie den gleichen Job machen. phjr auch tmpreaperin den Kommentaren empfohlen .

Paul Dixon
quelle
2
Mit --mmin + X werden alle Dateien mit meinem Fund zurückgegeben. Mein Fehler, dass ich dies nicht zuerst überprüft habe, aber dieser Befehl hat gerade den größten Teil meines Home-Verzeichnisses gelöscht. Für mich ist --mmin -X das richtige Argument.
Brandones
tmpreaper ist eine Gabelung von tmpwatch. Es ist sicherer und existiert als Debian-Paket in der Distribution. Vorteile gegenüber find -delete: tmpreaper entfernt keine Symlinks, Sockets, Fifos oder speziellen Dateien
Nadir
Weisen Sie darauf hin, dass $ REQUIRED_FILES in Anführungszeichen (doppelte Anführungszeichen) stehen muss und Sie ein Muster wie: " .txt" für alle .txt-Dateien oder Dateien verwenden können, die mit einem Muster wie: "temp- " beginnen, um alle mit temp benannten Dateien zu löschen -
Achasinh
@PaulDixon wie kann man das so ändern $LOCATIONund $REQUIRED_FILESkann beide mehrere Werte wie dir1 dir2und haben *.txt *.tmp?
Enissay
@Enissay $ LOCATION ist ein einzelnes Verzeichnis. Für mehrere Erweiterungen möchten Sie wahrscheinlich ein Muster mit -regex verwenden - siehe stackoverflow.com/questions/5249779/…
Paul Dixon
9

Sie könnten zu diesem Trick: Erstellen Sie eine Datei vor 1 Stunde und verwenden Sie das -newer fileArgument.

(Oder verwenden Sie touch -t, um eine solche Datei zu erstellen).

xtofl
quelle
1
Es gibt keinen -older-Schalter (zumindest in meinem Befehl find), und genau das wäre erforderlich. -newer hilft nicht.
Bilderstürmer
Können Sie einen Touch-Befehl geben, der eine 1 Stunde alte Datei generiert, die auf Computern funktioniert, die -mmin nicht verwenden können? (Wenn Sie unter Linux arbeiten, ist -mmin verfügbar. Wenn nicht, sind Datum und andere Befehle im Vergleich ebenfalls schwach.)
iconoclast
2
@iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) testErstellt eine Datei test, die immer 1 Stunde alt ist.
Rovr138
4

Hier ist der Ansatz, der für mich funktioniert hat (und ich sehe nicht, dass er oben verwendet wird)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

Löschen aller Dateien, die älter als 59 Minuten sind, während die Ordner intakt bleiben.

Axel Ronsin
quelle
Besser in einfache Anführungszeichen '*.*'oder die Shell erweitert es auf tatsächliche Dateinamen, anstatt es als Platzhalter für finddie Auflösung beizubehalten. Dies findunterbricht die rekursive Operation für Unterverzeichnisse.
MestreLion
Beachten Sie außerdem , dass -name '*.*'wird nicht löschen Dateien , die keine Erweiterung haben, wie README, Makefileetc.
MestreLion
1

Für SunOS 5.10

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.
Rajeev Rumale
quelle
0

-mmin ist für Minuten.

Schauen Sie sich die Manpage an.

man find

für mehr Typen.

GavinCattell
quelle
0

Wenn Sie in Ihrer Version von "find" nicht "-mmin" haben, kommt "-mtime -0.041667" "innerhalb der letzten Stunde" ziemlich nahe. Verwenden Sie in Ihrem Fall also:

-mtime +(X * 0.041667)

Wenn X also 6 Stunden bedeutet, dann:

find . -mtime +0.25 -ls

funktioniert, weil 24 Stunden * 0,25 = 6 Stunden

Malcolm Boekhoff
quelle
War hoffnungsvoll, weil dieses alte UNIX nicht -mmin hat, aber leider hilft dies nicht, da dieses alte UNIX auch keine Bruchwerte für mtime mag: find: Das Argument für -mtime muss eine Ganzzahl im Bereich von -2147483647 bis sein 2147483647
kbulgrien
0

Hier ist, was man tun kann, um den Weg zu gehen, über den sich @iconoclast in seinem Kommentar zu einer anderen Antwort gewundert hat .

Verwenden Sie crontab als Benutzer oder /etc/crontabzum Erstellen einer Datei /tmp/hour:

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

und verwenden Sie dies, um Ihren Befehl auszuführen:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;
satyr0909
quelle
*/1denn stündlich ist in Ihrem crontab überflüssig. Es ist dasselbe wie * in das Stundenfeld zu setzen.
colm.anseo
0

find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;

Eragonz91
quelle
0

Wenn man findnicht hat -mminund wenn man auch mit einem feststeckt find, der nur ganzzahlige Werte akzeptiert -mtime, dann ist nicht unbedingt alles verloren, wenn man bedenkt, dass "älter als" ähnlich ist wie "nicht neuer als".

Wenn wir in der Lage waren, eine Datei zu erstellen, die eine Zeitspanne unserer Grenzzeit hat, können wir Sie bitten find, die Dateien zu suchen, die "nicht neuer als" unsere Referenzdatei sind.

Das Erstellen einer Datei mit dem richtigen Zeitstempel ist etwas kompliziert, da ein System, das nicht über einen angemessenen verfügt, findwahrscheinlich auch über einen weniger als fähigen dateBefehl verfügt, der beispielsweise Folgendes ausführen kann : date +%Y%m%d%H%M%S -d "6 hours ago".

Glücklicherweise andere alte Tools, die dies verwalten können, wenn auch auf unhandlichere Weise.

Bedenken Sie, dass sechs Stunden 21600 Sekunden sind. Wir möchten die Zeit vor sechs Stunden in einem nützlichen Format ermitteln:

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

Die Perl-Anweisung hat zwar ein nützliches Datum hervorgebracht, muss aber besser genutzt werden:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

Die Lösung für dieses alte UNIX lautet nun wie folgt:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

Es könnte auch eine gute Idee sein, unsere Referenzdatei zu bereinigen ...

$ rm -f ref_file
kbulgrien
quelle