Linux: utilisation de find pour localiser des fichiers antérieurs à <date>

31

finda un bon support pour trouver les fichiers les plus modifiés il y a moins de X jours, mais comment puis-je utiliser findpour localiser tous les fichiers modifiés après une certaine date?

Je ne trouve rien dans la findpage de manuel pour le faire, seulement pour comparer avec un autre temps de fichiers ou pour vérifier les différences entre le temps créé et maintenant. La création d'un fichier avec le temps souhaité et la comparaison sont-elles la seule façon de procéder?

DrStalker
la source
1
Ce serait mieux demandé sur SuperUser.com
Josh Brower
6
Je ne vais pas terminer ceci: cela pourrait aussi être intéressant pour les administrateurs système.
splattne
La commande fait partie d'un script de sauvegarde, qui récupère tout de / etc qui a été modifié après l'installation dans nos sauvegardes nocturnes.
DrStalker
Neuf ans et je viens de le remarquer en modérant une nouvelle réponse: le titre et le corps de cette question ne sont pas les mêmes. Le titre demande «des fichiers antérieurs à <date>» mais le corps indique «modifiés après une certaine date». J'interprète «après» comme plus récent qu'une date spécifique, pas plus ancien.
Joffrey

Réponses:

19

Si vous n'avez que «-newer file», vous pouvez prendre cette solution de contournement:

touch -t 201003160120 some_file
find . -newer some_file

toucher de l'homme:

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

En supposant que votre toucher a cette option (le mien est tactile 5,97).

Krzysztof Krasoń
la source
48

Non, vous pouvez utiliser une chaîne de date / heure.

De man find:

-newerXY reference
Compare l'horodatage du fichier actuel avec référence. L'argument de référence est normalement le nom d'un fichier (et l'un de ses horodatages est utilisé pour la comparaison) mais il peut également s'agir d'une chaîne décrivant une heure absolue. X et Y sont des espaces réservés pour d'autres lettres, et ces lettres sélectionnent l'heure appartenant à la façon dont la référence est utilisée pour la comparaison.

          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

Exemple:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls
En pause jusqu'à nouvel ordre.
la source
5
J'utilise Centos 5.2, qui utilise GNU find version 4.2.27, et il ne prend pas en charge -newermt ni aucun paramètre -newer autre que "-newer file"
DrStalker
1
GNU findutils 4.3.3 et les supports plus récents -newerXY selon savannah.gnu.org/bugs/?11668
Philip Durbin
25

Pas directement lié à la question, mais pourrait être intéressant pour certains qui trébucheront ici.

La commande find ne prend pas directement en charge le paramètre -older pour rechercher des fichiers antérieurs à une date requise, mais vous pouvez utiliser l'instruction negate (à l'aide d'un exemple de réponse accepté):

touch -t 201003160120 some_file
find . ! -newer some_file

renverra les fichiers plus anciens que la date fournie.

nEJC
la source
3
éditeurs - peut-être devrait-il être fusionné en réponse acceptée?
nEJC
cette solution est la façon la plus élégante de résoudre ce genre de problème :)
Labynocle
9
find <dir> -mtime -20

cette commande find trouvera les fichiers modifiés au cours des 20 derniers jours.

  • mtime -> modifié (atime = accédé, ctime = créé)
  • -20 -> moins de 20 jours (20 exactement 20 jours, +20 plus de 20 jours)

Vous pouvez ajouter des limitations supplémentaires comme:

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

comme avant, mais ne trouve que les fichiers se terminant par '.txt'.

markus_b
la source
5

Juste pour ajouter - vous pouvez même utiliser deux arguments newermt pour rechercher dans un intervalle de temps:

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

pour retrouver tous les fichiers de mars 2007.

MortenSickel
la source
1

Vous pouvez utiliser un script comme celui-ci

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

Enregistrez-le dans votre $ PATH sous le nom "newerthan" et rendez-le exécutable.

Ensuite, vous pouvez trouver un fichier modifié après une certaine date comme ceci:

newerthan "2010-03-10"

ou

newerthan "last year"

ou

newerthan "yesterday"

Cela devrait faire ce que vous voulez. Je ne pense pas qu'il existe un moyen intégré pour y parvenir autrement.

Richard Holloway
la source
Il n'est pas nécessaire d'utiliser bcpour les mathématiques entières, Bash peut le faire ((seconds = when - now)):, l'argument format datedoit avoir un plus date +%set certains systèmes peuvent ne pas avoirdate -d
Pause jusqu'à nouvel ordre.
C'est pour Centos 5.2. Ce qui a -d. Cependant, il est utile de connaître les mathématiques entières.
Richard Holloway
1
find ! -newermt “<DATE>”

comme ça:

find ! -newermt “jan 01 2015” 

Cela vous donnera des fichiers antérieurs au 01-01-2015 dans votre répertoire actuel.

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

Muzaffar Mahmood
la source
J'étais sur le point d'écrire un commentaire vous souhaitant la bienvenue sur ServerFault et vous demandant de reconsidérer la pose d'une réponse en double jusqu'à ce que je réalise que le titre et le corps de la question disent des choses différentes: le titre demande 'des fichiers plus anciens que <date>' et les états de la question 'modifiés après une certaine date », qui à mon avis sont deux choses différentes. Peut-être pourriez-vous dans votre article clarifier la différence et expliquer l'utilisation du négatif. Merci d'avoir contribué et je posterai un commentaire sur la question pour clarification. Merci d'avoir contribué!
Joffrey
0

si votre date est formatée de façon à ce qu'elle puisse être comparée,

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