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:
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.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")
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.
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.
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
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
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
.
$ oldfiles [-v...] ([-h|-V|-n] | {[(-a|-u) | (-m|-t) | -c] (-i | -d | -o| -y | -g) N (-\> | -\< | -\=) [-p "pat"]})
-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"
-a ou -u: temps d'accès (d'utilisation)
- m ou -t: heure de modification (par défaut)
- c: changement d'état d'inode
-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")
-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).
$ 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
$ 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
$ 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}
.
Vous remarquerez également que l'option "ls" ls OPT
Change pour correspondre au type de temps que vous choisissez.
oldfiles
: