Frage Linux: Mit find finden Sie Dateien, die älter als sind


find hat eine gute Unterstützung für das Finden von Dateien, die vor weniger als X Tagen modifiziert wurden, aber wie kann ich verwenden find um alle Dateien zu finden, die nach einem bestimmten Datum geändert wurden?

Ich kann nichts finden in der find Man-Seite, um dies zu tun, nur um mit anderen Dateien Zeit zu vergleichen oder um Unterschiede zwischen erstellt Zeit und jetzt zu überprüfen. Macht eine Datei mit der gewünschten Zeit und vergleicht dagegen die einzige Möglichkeit?


27
2018-03-16 04:22


Ursprung


Dies wäre besser auf SuperUser.com gefragt - Josh Brower
Ich schließe das nicht: könnte auch für Systemadministratoren interessant sein. - splattne
Der Befehl ist Teil eines Backup-Skripts, das alles von / etc abpackt, das nach der Installation in unseren nächtlichen Backups geändert wurde. - DrStalker


Antworten:


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

touch -t 201003160120 some_file
find . -newer some_file

Mann berühren:

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

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


16
2018-03-16 08:13





Nein, Sie können eine Datum / Uhrzeit-Zeichenfolge verwenden.

Von man find:

-newerXY-Referenz
               Vergleicht den Zeitstempel der aktuellen Datei mit Referenz. Das                 Referenzargument ist normalerweise der Name einer Datei (und eines von                 seine Zeitstempel werden für den Vergleich verwendet, aber es kann auch ein sein                 String, der eine absolute Zeit beschreibt. X und Y sind Platzhalter                 für andere Buchstaben, und diese Buchstaben wählen aus, welche Zeit gehört                 wie 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

39
2018-03-16 04:52



Ich benutze Centos 5.2, das GNU find Version 4.2.27 verwendet, und nicht -newermt oder irgendwelche -newer-Parameter außer "-newer file" - DrStalker
GNU findutils 4.3.3 und neuer unterstützt -newerXY nach savannah.gnu.org/bugs/?11668 - Philip Durbin


Nicht direkt mit Frage verwandt, aber könnte für einige interessant sein, die hier stolpern.

finden Der Befehl unterstützt nicht direkt -older-Parameter zum Auffinden von Dateien, die älter als ein erforderliches Datum sind, aber Sie können die negate-Anweisung verwenden (unter Verwendung des akzeptierten Antwortbeispiels):

touch -t 201003160120 some_file
find . ! -newer some_file

gibt Dateien zurück älter als angegebenes Datum.


23
2017-09-06 12:17



Redakteure - 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


find <dir> -mtime -20

Dieser Suchbefehl findet Dateien, die innerhalb der letzten 20 Tage geändert wurden.

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

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

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

das gleiche wie zuvor, aber findet nur Dateien, die mit '.txt' enden.


9
2018-03-16 12:13





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

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

um alle Dateien ab März 2007 zu finden.


4
2017-12-30 21:48





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 "neuwert" und machen Sie es ausführbar.

Dann können Sie Dateien finden, die nach einem bestimmten Datum wie folgt geändert wurden:

newerthan "2010-03-10"

oder

newerthan "last year"

oder

newerthan "yesterday"

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


1
2018-03-16 08:29



Es ist nicht notwendig zu verwenden bc für ganzzahlige Mathe kann Bash es tun: ((seconds = when - now)), das Format Argument zu date sollte ein Plus haben date +%s und einige Systeme haben vielleicht nicht date -d - Dennis Williamson
Dies ist für Centos 5.2. Was hat -d. Nützlich, um über die Integer-Mathematik zu wissen. - Richard Holloway


Wenn Ihr Datum so formatiert ist, dass es zum Vergleich ok ist,

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

0
2018-03-16 10:23