it-swarm.com.de

Suchen Sie nach Dateien, die zwischen einem Datumsbereich erstellt wurden

Ich verwende AIX über Telnet hier bei der Arbeit und möchte wissen, wie man Dateien in einem bestimmten Ordner zwischen einem Datumsbereich findet. Zum Beispiel: Ich möchte alle Dateien in Ordner X finden, die zwischen dem 01.08.13 und dem 31.08.13 erstellt wurden.

Beobachtungen:

  • Der Trick touch (bei dem Sie zwei leere Dateien erstellen, um die Option -newer zu verwenden) funktioniert bei mir nicht, sobald die Benutzerrollen, die ich auf dem Server habe, mir nicht erlauben, Dateien zu erstellen.
  • Ich muss zwischen bestimmten Daten und nicht zwischen Tagen suchen (z. B. Dateien, die vor mehr als 30 Tagen erstellt wurden usw.)
32
sanjuro8998

Sie können das unten stehende verwenden, um zu finden, was Sie benötigen.

Dateien suchen, die älter als ein bestimmtes Datum/eine bestimmte Uhrzeit sind:

find ~/ -mtime $(echo $(date +%s) - $(date +%s -d"Dec 31, 2009 23:59:59") | bc -l | awk '{print $1 / 86400}' | bc -l)

Oder Sie können Dateien zwischen zwei Daten suchen. Erstes Datum neuer, letztes Datum älter. Sie können auf die Sekunde eingehen und müssen mtime nicht verwenden. Sie können alles verwenden, was Sie brauchen.

find . -mtime $(date +%s -d"Aug 10, 2013 23:59:59") -mtime $(date +%s -d"Aug 1, 2013 23:59:59")
7
Alex Atkinson

Wenn Sie GNU find verwenden, können Sie seit Version 4.3.3 Folgendes tun:

find -newerct "1 Aug 2013" ! -newerct "1 Sep 2013" -ls

Es akzeptiert jede Datumszeichenfolge, die von GNU date -d Akzeptiert wird.

Sie können c in -newerct In a, B, c oder m ändern, um danach zu suchen zur Zeit/Geburt/ctime/mtime.

Ein weiteres Beispiel - Listen Sie Dateien auf, die am 6. November 2017 zwischen 17:30 und 22:00 Uhr geändert wurden:

find -newermt "2017-11-06 17:30:00" ! -newermt "2017-11-06 22:00:00" -ls

Vollständige Details von man find:

   -newerXY reference
          Compares the timestamp of the current file with reference.  The reference argument is normally the name of a file (and one of its timestamps  is  used
          for  the  comparison)  but  it may also be a string describing an absolute time.  X and Y are placeholders for other letters, and these letters select
          which time belonging to how reference is used for the comparison.

          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

          Some combinations are invalid; for example, it is invalid for X to be t.  Some combinations are not implemented on all systems; for example B  is  not
          supported on all systems.  If an invalid or unsupported combination of XY is specified, a fatal error results.  Time specifications are interpreted as
          for the argument to the -d option of GNU date.  If you try to use the birth time of a reference file, and the birth time cannot be determined, a fatal
          error  message  results.   If  you  specify a test which refers to the birth time of files being examined, this test will fail for any files where the
          birth time is unknown.
97
codebeard

Versuche dies:

find /var/tmp -mtime +2 -a -mtime -8 -ls

um Dateien zu finden, die älter als 2 Tage, aber nicht älter als 8 Tage sind.

40
frank42

Einige gute Lösungen hier. Wollte meine so gut teilen, wie es kurz und einfach ist.

Ich verwende find (GNU findutils) 4.5.11

$ find search/path/ -newermt 20130801 \! -newermt 20130831
12
Jason Slobotski

Verwenden Sie stat, um die Erstellungszeit zu ermitteln. Sie können die Zeit im Format YYYY-MM-DD HH:MM:SS Lexikographisch vergleichen.

Diese Arbeit unter Linux mit Änderungszeit, Erstellungszeit wird nicht unterstützt. Unter AIX wird die Option -c Möglicherweise nicht unterstützt, aber Sie sollten die Informationen trotzdem mit grep abrufen können, wenn nichts anderes funktioniert.

#! /bin/bash
from='2013-08-01 00:00:00.0000000000' # 01-Aug-13
to='2013-08-31 23:59:59.9999999999'   # 31-Aug-13

for file in * ; do
    modified=$( stat -c%y "$file" )
    if [[ $from < $modified && $modified < $to ]] ; then
        echo "$file"
    fi
done
5
choroba

Skript alte Dateien

Ich habe versucht, diese Frage vollständiger zu beantworten, und schließlich ein vollständiges Skript mit Optionen erstellt, um Ihnen das Verständnis des Befehls find zu erleichtern.

Das Skript oldfiles befindet sich in diesem Repository

Um einen neuen Suchbefehl zu "erstellen", führen Sie ihn mit der Option -n (Probelauf) aus und Sie erhalten den korrekten find Befehl, den Sie verwenden müssen.

Wenn Sie das -n Weglassen, wird es nur ausgeführt, und Sie müssen den Befehl find nicht erneut eingeben.

Verwendung:

$ oldfiles [-v...] ([-h|-V|-n] | {[(-a|-u) | (-m|-t) | -c] (-i | -d | -o| -y | -g) N (-\> | -\< | -\=) [-p "pat"]})

  • Wenn die Optionen in folgende Gruppen eingeteilt sind:
    • Hilfe & Info:

      -h, --help: Zeigt diese Hilfe an.
      - V, --version: Version anzeigen.
      - v, --verbose: Aktivieren Sie den Verbose-Modus (kumulativ).
      - n, --dry-run: Nicht ausführen, nur erläutern, wie ein "find" -Befehl erstellt wird

    • Zeittyp (Zugriff/Verwendung, Änderungszeit oder geänderter Status):

      -a oder -u: Zugriffszeit
      - m oder -t: Änderungszeit (Standard)
      - c: Inode-Statusänderung

    • Zeitbereich (wobei N eine positive ganze Zahl ist):

      -i N: Minuten (Standard, wobei N 1 Minute entspricht)
      - d N: Tage
      - o N: Monate
      - y N: Jahre
      - g N: N ist ein DATUM (Beispiel: "2017-07-06 22:17:15")

    • Tests:

      -p "pat": Optionales Muster zum Abgleichen (Beispiel: -p "* .c" zum Suchen von c-Dateien) (Standard -p "*")
      - \>: Datei ist neuer als der angegebene Bereich, dh die Zeit wird danach geändert.
      -\<: Datei ist älter als der angegebene Bereich, dh die Zeit liegt vor der angegebenen Zeit. (Standard)
      -\=: Datei, die genau N (min, tag, monat, jahr) alt ist.

Beispiel:

  • Finden Sie C-Quelldateien, die neuer als 10 Minuten (Zugriffszeit) sind (mit Ausführlichkeit 3):

$ oldfiles -a -i 10 -p"*.c" -\> -nvvv Starting oldfiles script, by beco, version 20170706.202054... $ oldfiles -vvv -a -i 10 -p "*.c" -\> -n Looking for "*.c" files with (a)ccess time newer than 10 minute(s) find . -name "*.c" -type f -amin -10 -exec ls -ltu --time-style=long-iso {} + Dry-run

  • Suche nach H-Header-Dateien, die älter als ein Monat sind (Änderungszeit) (Ausführlichkeit 2):

$ oldfiles -m -o 1 -p"*.h" -\< -nvv Starting oldfiles script, by beco, version 20170706.202054... $ oldfiles -vv -m -o 1 -p "*.h" -\< -n find . -name "*.h" -type f -mtime +30 -exec ls -lt --time-style=long-iso {} + Dry-run

  • Finden Sie alle (*) Dateien an einem einzigen Tag (1. Dezember 2016; keine Ausführlichkeit, Probelauf):

$ oldfiles -mng "2016-12-01" -\= find . -name "*" -type f -newermt "2016-11-30 23:59:59" ! -newermt "2016-12-01 23:59:59" -exec ls -lt --time-style=long-iso {} +

Wenn Sie den -n - Code entfernen, führt das Programm den Befehl find selbst aus und erspart Ihnen die Mühe.

Ich hoffe, dies hilft allen, diese {a,c,t}{time,min} - Optionen endlich zu lernen.

der LS-Ausgang:

Sie werden auch feststellen, dass sich die Option "ls" ls OPT Entsprechend der von Ihnen gewählten Zeit ändert.

Link zum Klonen/Herunterladen des Skripts oldfiles:

https://github.com/drbeco/oldfiles

2
Dr Beco