Linux: Verwenden Sie find, um Dateien zu finden, die älter als <Datum> sind

31

findHat eine gute Unterstützung für die Suche nach Dateien, die vor weniger als X Tagen geändert wurden. Wie kann ich findjedoch alle Dateien finden, die nach einem bestimmten Datum geändert wurden?

Ich kann nichts in der findManpage finden, um dies zu tun, nur um die Zeit mit einer anderen Datei zu vergleichen oder um Unterschiede zwischen der erstellten Zeit und der aktuellen Zeit festzustellen . Ist es die einzige Möglichkeit, eine Datei mit der gewünschten Zeit zu erstellen und mit dieser zu vergleichen?

DrStalker
quelle
1
Dies wäre besser auf SuperUser.com gefragt
Josh Brower
6
Ich schließe das nicht ab: Könnte auch für Sysadmins interessant sein.
Splattne
Der Befehl bezieht sich auf einen Teil eines Sicherungsskripts, das alles aus / etc abruft, was nach der Installation in unseren nächtlichen Sicherungen geändert wurde.
DrStalker
Neun Jahre alt und mir ist gerade aufgefallen, als ich eine neue Antwort moderierte: Titel und Text dieser Frage stimmen nicht überein. Der Titel fragt nach "Dateien, die älter als <Datum> sind", der Text lautet jedoch "nach einem bestimmten Datum geändert". Ich interpretiere "danach" als neuer als ein bestimmtes Datum, nicht älter.
Joffrey

Antworten:

19

Wenn Sie nur '-newer file' haben, können Sie diese Problemumgehung anwenden:

touch -t 201003160120 some_file
find . -newer some_file

Männerberührung:

  -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

Vorausgesetzt, Ihre Berührung hat diese Option (meine ist Berührung 5.97).

Krzysztof Krasoń
quelle
48

Nein, Sie können eine Datums- / Uhrzeitzeichenfolge verwenden.

Von man find:

-newerXY Referenz
Vergleicht den Zeitstempel der aktuellen Datei mit der Referenz. Das Referenzargument ist normalerweise der Name einer Datei (und einer ihrer Zeitstempel wird für den Vergleich verwendet), es kann jedoch auch eine Zeichenfolge sein, die eine absolute Zeit beschreibt. X und Y sind Platzhalter für andere Buchstaben. Mit diesen Buchstaben wird ausgewählt, zu welcher Zeit die Referenz für den Vergleich verwendet wird.

          a   The access time of the file reference
          B   The birth time of the file reference
          c   The inode status change time of reference
          m   The modification time of the file reference
          t   reference is interpreted directly as a time

Beispiel:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls
Bis auf weiteres angehalten.
quelle
5
Ich verwende Centos 5.2, das GNU find Version 4.2.27 verwendet, und es unterstützt keine -newermt oder andere -newer-Parameter als "-newer file"
DrStalker
1
GNU findutils 4.3.3 und neue Träger -newerXY nach savannah.gnu.org/bugs/?11668
Philip Durbin
25

Nicht direkt mit der Frage verbunden, aber für einige, die hier stolpern, interessant.

Der Befehl find unterstützt den Parameter -older nicht direkt zum Suchen von Dateien, die älter als ein erforderliches Datum sind. Sie können jedoch die Anweisung negate verwenden (unter Verwendung eines akzeptierten Antwortbeispiels):

touch -t 201003160120 some_file
find . ! -newer some_file

gibt Dateien zurück, die älter als das angegebene Datum sind.

nEJC
quelle
3
Editoren - Vielleicht sollte es in akzeptierte Antwort zusammengeführt werden?
NEJC
Diese Lösung ist der eleganteste Weg, um diese Art von Problem zu lösen :)
Labynocle
9
find <dir> -mtime -20

Dieser Befehl find findet Dateien, die in den letzten 20 Tagen geändert wurden.

  • mtime -> modified (atime = zugegriffen, ctime = erstellt)
  • -20 -> mindestens 20 Tage alt (20 genau 20 Tage, +20 mehr als 20 Tage)

Sie können zusätzliche Einschränkungen hinzufügen, wie zum Beispiel:

find <dir> -mtime -20 -name "*.txt"

Das gleiche wie zuvor, findet jedoch nur Dateien, die mit '.txt' enden.

markus_b
quelle
5

Nur zum Hinzufügen - Sie können sogar zwei neue Argumente verwenden, um in einem Zeitintervall zu suchen:

find ! -newermt "apr 01 2007" -newermt "mar 01 2007" -ls

um alle Dateien von März 2007 zu finden.

MortenSickel
quelle
1

Sie könnten ein Skript wie dieses verwenden

#!/bin/bash

if [ $# -ne 1 ];then
  when="today"
else
  when=` date -d "$1" +"%s" `
fi
now=`date +"%s"`

seconds=`echo "$when - $now" | bc`
minutes=`echo "$seconds / 60 " | bc `

find . -cmin $minutes -print

Speichern Sie es in Ihrem $ PATH als "newerthan" und machen Sie es ausführbar.

Dann können Sie eine Datei finden, die nach einem bestimmten Datum wie folgt geändert wurde:

newerthan "2010-03-10"

oder

newerthan "last year"

oder

newerthan "yesterday"

Das sollte machen was du willst. Ich denke nicht, dass es einen eingebauten Weg gibt, um dies anders zu erreichen.

Richard Holloway
quelle
Es ist nicht notwendig, dies bcfür ganzzahlige Berechnungen zu verwenden. Bash kann dies: ((seconds = when - now))Das Argument format datesollte ein Pluszeichen haben, date +%sund einige Systeme haben es möglicherweise nicht.date -d
Bis auf weiteres angehalten.
Dies ist für Centos 5.2. Welches hat -d. Nützlich, um etwas über die Ganzzahl-Mathematik zu wissen.
Richard Holloway
1
find ! -newermt “<DATE>”

so was:

find ! -newermt “jan 01 2015” 

Dadurch erhalten Sie Dateien, die älter als der 01.01.2015 sind, in Ihrem aktuellen Verzeichnis.

https://muzaffarmahmoodblog.wordpress.com/2019/07/11/linux-command-to-remove-files-older-than-2015-in-a-directory/

Muzaffar Mahmood
quelle
Ich wollte gerade einen Kommentar schreiben, in dem ich Sie auf ServerFault begrüßte und Sie aufforderte, eine doppelte Antwort zu überdenken, bis mir klar wurde, dass der Fragentitel und der Text unterschiedliche Aussagen enthalten: Im Titel werden nach Dateien gefragt, die älter als <Datum> sind, und der Fragestatus wurde geändert nach einem bestimmten Datum ', was meiner Meinung nach zwei verschiedene Dinge sind. Vielleicht könntest du in deinem Beitrag den Unterschied klären und die Verwendung des Negates erklären. Vielen Dank für Ihren Beitrag. Ich werde die Frage zur Klärung kommentieren. Vielen Dank für Ihren Beitrag!
Joffrey
0

Wenn Ihr Datum so formatiert ist, dass es zum Vergleich in Ordnung ist,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
user37841
quelle