web-dev-qa-db-fra.com

Rechercher des fichiers créés entre une plage de dates

J'utilise AIX via telnet ici au travail et j'aimerais savoir comment trouver des fichiers dans un dossier spécifique entre une plage de dates. Par exemple: Je souhaite rechercher tous les fichiers du dossier X créés entre le 01 août 2013 et le 31 août 2013.

Observations:

  • L'astuce touch (où vous créez deux fichiers vides pour utiliser l'option -newer) ne fonctionne pas pour moi, une fois que les rôles d'utilisateur que j'ai sur le serveur ne me permettent pas de créer des fichiers.
  • J'ai besoin de trouver entre des dates spécifiques et non des jours (comme: des fichiers créés il y a plus de 30 jours, etc.)
32
sanjuro8998

Vous pouvez utiliser ce qui suit pour trouver ce dont vous avez besoin.

Trouver des fichiers plus anciens qu'une date/heure spécifique:

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

Ou vous pouvez trouver des fichiers entre deux dates. Première date plus récente, dernière date, plus ancienne. Vous pouvez descendre à la seconde et vous n'avez pas à utiliser mtime. Vous pouvez utiliser tout ce dont vous avez besoin.

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

Si vous utilisez GNU find, depuis la version 4.3.3, vous pouvez faire:

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

Il acceptera toute chaîne de date acceptée par GNU date -d.

Vous pouvez changer le c dans -newerct à a, B, c ou m pour regarder atime/birth/ctime/mtime.

Autre exemple - liste des fichiers modifiés entre 17h30 et 22h00 le 6 novembre 2017:

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

Tous les détails de 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

Essaye ça:

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

trouver des fichiers de plus de 2 jours mais de moins de 8 jours.

40
frank42

Quelques bonnes solutions ici. Voulait partager le mien aussi bien que c'est court et simple.

J'utilise find (GNU findutils) 4.5.11

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

Utilisez stat pour obtenir le temps de création. Vous pouvez comparer l'heure au format YYYY-MM-DD HH:MM:SS Lexicographiquement.

Ce travail sur Linux avec le temps de modification, le temps de création n'est pas supporté. Sous AIX, l'option -c N'est peut-être pas prise en charge, mais vous devriez quand même pouvoir obtenir les informations, en utilisant grep si rien d'autre ne fonctionne.

#! /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

Script oldfiles

J'ai essayé de répondre à cette question de manière plus complète et j'ai fini par créer un script complet avec des options pour vous aider à comprendre la commande find.

Le script oldfiles est dans ce référentiel

Pour "créer" une nouvelle commande de recherche, exécutez-la avec l'option -n (Exécution à sec) et vous recevrez la commande find correcte à utiliser.

Bien sûr, si vous omettez le paramètre -n, Il ne vous reste plus qu'à exécuter la commande, inutile de ressaisir la commande find.

Usage:

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

  • Où les options sont classées dans les groupes suivants:
    • Aide et information:

      -h, --help: Affiche cette aide.
      - V, --version: Afficher la version.
      - v, --verbose: active le mode verbose (cumulatif).
      - n, --dry-run: ne pas exécuter, expliquez simplement comment créer une commande "find"

    • Type d’heure (accès/utilisation, heure de modification ou statut modifié):

      -a ou -u: temps d'accès (d'utilisation)
      - m ou -t: heure de modification (par défaut)
      - c: changement d'état d'inode

    • Plage de temps (où N est un entier positif):

      -i N: minutes (par défaut, avec N égal à 1 min)
      - d N: jours
      - o N: mois
      - y N: années
      - g N: N est une DATE (exemple: "2017-07-06 22:17:15")

    • Tests:

      -p "pat": modèle optionnel à rechercher (exemple: -p "* .c" pour rechercher les fichiers c) (défaut -p "*")
      - \>: le fichier est plus récent qu'une plage donnée, c'est-à-dire le temps modifié après celle-ci.
      -\<: le fichier est plus ancien que la plage donnée, c’est-à-dire que le temps est écoulé avant. (défaut)
      -\=: fichier qui a exactement N (min, jour, mois, année).

Exemple:

  • Recherchez les fichiers source C inférieurs à 10 minutes (temps d'accès) (avec la verbosité 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

  • Rechercher les fichiers d'en-tête H de plus d'un mois (heure de modification) (verbosité 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

  • Trouver tous les fichiers (*) dans la même journée (1er décembre 2016; pas de verbosité, passage à vide):

$ 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 {} +

Bien sûr, en supprimant le -n, Le programme exécutera lui-même la commande find et vous épargnera le problème.

J'espère que cela aide tout le monde à enfin apprendre cette option {a,c,t}{time,min}.

la sortie LS:

Vous remarquerez également que l'option "ls" ls OPT Change pour correspondre au type de temps que vous choisissez.

Lien pour cloner/télécharger le script oldfiles:

https://github.com/drbeco/oldfiles

2
Dr Beco