Geekzeug

Dateien neuer als Datei X finden

Welche Dateien sind neuer als eine gegebene Datei? Gute Frage, zwei Antworten.

Manchmal möchte man mit Dateien arbeiten, die neuer sind, als das letzte Bearbeitungsdatum einer gegebenen Datei – sie zum Beispiel verschieben oder in einem Rutsch umbenennen. Das geht mit dem Tool find ziemlich einfach, aber auch ziemlich unnötig un-einfach ;) Un-einfach bringt hier aber nicht nur einen nicht zu unterschätzenden Lerneffekt, sondern ist auch flexibler.

Zunächst mal ein Beispiel aus der hiesigen Praxis: Index pflegen. Die Suche in Bash ist ziemlich langsam, wenn man mal ein paar Tausend Dateien durchforsten muss. In einem Testordner liegen hier 30.000+ Dateien. Diese etwa nach regulären Ausdrücken zu durchforsten und etwas damit anzustellen, dauert bisweilen Minuten. Was viel schneller geht: Eine Textdatei mit den Dateinamen samt Pfad durchsuchen – ein Index, wie ihn im Prinzip auch Suchmaschinen nutzen. Und dieser Index wird hin und wieder um neu hinzugekommene Dateien ergänzt.

Zeitlich sind hier lediglich Tage interessant. Die einfache Variante wäre: Alter der Index-Datei nachgucken und das Alter entsprechend manuell angeben, find kann schließlich auch direkte Zeitangaben in Tagen verarbeiten. Unsere unnötig komplizierte Variante macht eigentlich genau das, aber das Alter in Tagen wird automatisch berechnet. Die einfache Variante überlässt jegliches Zahlenwerk komplett find selbst:

find -newer index-datei.txt

Einfacher geht’s nicht – wenn man nur nicht ständig die find-Syntax vergessen würde, woll?! Die Aufgabe ist damit erledigt, aber die Lösung ist schon etwas blackboxig. Statt der newer-Option könnte man wie erwähnt auch schlicht das Alter manuell angeben, etwa so, wenn Dateien weniger als 10 Tage alt sein sollen:

find -mtime -10

Die Option mtime – (weniger als) gibt es analog für ein Mindestalter in der Form mtime + und beiden gemein ist: Es geht um ganze Tage im Sinne von 24-Stunden-Perioden. Weiters geht es explizit um das Bearbeitungsdatum, das Access-Datum könnte über atime abgegriffen werden, das Change-Datum über ctime.

Die folgende Lösung macht nichts weiter, als eben diese 10 anhand der Datei index-datei.txt automatisch zu ermitteln und zu setzen – das bildet (bestenfalls) und Ihr könntet die newer-Option auch für Access- und Change-Datum umsetzen, die sich alle via stat abrufen lassen.

Unnötig kompliziert

Die eigentliche Frage ist doch: Vor wie vielen Tagen wurde die Datei zuletzt bearbeitet. Das Alter einer Datei schaut man sich meist mit stat an:

stat index-datei.txt

Und wenn es nur das Bearbeitungsdatum sein soll, gibt es zwei Optionen:

stat -c %y index-datei.txt
stat -c %Y index-datei.txt

Mit kleinem Y ergibt das zum Beispiel 2022-06-01 00:00:00.000000000 +0200 in der menschenlesbaren Version und mit großem Y 1654034400 in der Unixzeit. Unixzeit heißt: Sekunden seit dem 1.7.1970 (The Epoch). Auch das folgende Kommando gibt eine Unixzeit aus – und zwar die aktuelle:

date +%s

Und damit ergibt sich schon mal, wie man das Alter der Index-Datei in Sekunden bestimmen kann: „Aktuelles Datum in Sekunden minus Bearbeitungsdatum in Sekunden“, oder date – stat. Und Bash wäre nicht Bash, wenn das nicht was bedeuten würde? Genau, eine Klammerorgie:

dage=$(( $(( $(date +%s)-$(stat -c %Y index-datei.txt ) )) / 86400 ))
find -mtime -$dage

Das ist nur die übliche Bash-Syntax, sprich doppelte runde Klammern für die Arithmetik und einfache runde Klammern für das Abrufen der jeweiligen Zeitstempel. Die 86400 ergeben sich hoffentlich (!) von allein, so von wegen 60 x 60 x 24 … Das Schöne an der Unixzeit ist im Grunde, dass es sich schlicht um eine einzige Zahl handelt mit der man auch rechnen kann und sich nicht um irgendwelche Formate sorgen müsste. Diese Unixzeit-Rechnerei kommt immer wieder mal vor, auch wenn es zumindest hier eine deutlich elegantere Lösung gibt.

Hier sieht der ganze Befehl in der Praxis daher auch schlicht so aus:

find /files/test -newer index >> index

Damit werden eben alle Dateien gefunden, die beliebig viel jünger sind als der Index und diesem hinzugefügt – woraufhin der Index natürlich wieder selbst die jüngste (modifizierte) Datei ist. So könnte man auch ein supersimples Backup realisieren.

Zu mehr Terminal-Spaß – nützlichen wie völlig blödsinnigen – geht es hier entlang, zu unserer hauseigenen Hilfe für die Kommandozeile hier.

Einstiegsbild basiert auf: Image by Peggy und Marco Lachmann-Anke from Pixabay

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

Ein Kommentar

  1. Die geschachtelte arithmetische Operation kann in einer einzigen Berechnung durchgeführt werden. Der Ausdruck kann um vier Klammern gekürzt, muss dann aber wegen diesem Punkt-vor-Strich-rechnen-Ding wieder um zwei Klammern erweitert werden.

    dage=$(( ( $(date +%s)-$(stat -c %Y index-datei.txt ) ) / 86400 ))

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Schaltfläche "Zurück zum Anfang"
Schließen

Ooopsi!

Bitte deaktiviere Deinen Adblocker.