Comment utiliser «rechercher» pour rechercher des fichiers créés à une date spécifique? [fermé]

254

Comment utiliser la commande UNIX findpour rechercher des fichiers créés à une date spécifique?

sverrejoh
la source
8
Il semble que les questions de script bash soient autorisées.
Alan
@MichaelScheper: Je ne sais même pas par où commencer avec ce commentaire.
Courses de légèreté en orbite
1
@Notinlist: Voici la réponse: meta.stackexchange.com/questions/10249/… Malheureusement, il s'avère qu'un délai a expiré. Dommage, car les recherches sur le Web arrivent toujours ici, et la réponse acceptée a été utile pour beaucoup de gens.
Michael Scheper
@MichaelScheper: Si vous pouvez trouver une option pour voter pour migrer vers unix.stackexchange.com, indiquez-moi par là. Puisque vous n'avez pas le représentant pour voir la boîte de dialogue de fermeture, je vais vous donner un indice: il n'y en a pas. Pensez à être moins combatif lorsque vous ne savez pas de quoi vous parlez. Merci de votre attention.
Courses de légèreté en orbite
5
@LightnessRacesinOrbit: Je m'excuse d'être apparu comme «combatif». Je ne suis pas autorisé à modifier mes commentaires, mais pour référence future, est-ce mon commentaire louant la question qui vous a offensé? Je dois dire que je me sens un peu aveugle, même après avoir donné à votre commentaire précédent le bénéfice du doute. J'essayais en fait d'être plus constructif que d'ajouter un autre «moi aussi», en cherchant comment fonctionne la migration: meta.stackexchange.com/a/10250/249555 Le délai de 60 jours cache cette option, peut-être? Désolé pour le bum steer. Merci encore - sincèrement - pour votre temps et votre attention.
Michael Scheper

Réponses:

323

Comme l'a souligné Max, vous ne pouvez pas, mais vérifier les fichiers modifiés ou accessibles n'est pas si difficile. J'ai écrit un tutoriel à ce sujet jusqu'à aujourd'hui. Dont l'essence est d'utiliser -newerXYet ! -newerXY:

Exemple: pour rechercher tous les fichiers modifiés le 7 juin 2007:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

Pour retrouver tous les fichiers consultés le 29 septembre 2008:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

Ou, les fichiers dont l'autorisation a été modifiée le même jour:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

Si vous ne modifiez pas les autorisations sur le fichier, «c» correspond normalement à la date de création, cependant.

Arve
la source
7
Ma version de find (GNU 4.2.32) ne semble pas prendre en charge les prédicats -newerXY. Une version minimale particulière est-elle nécessaire? Ou s'agit-il de compiler find avec un commutateur de configuration spécial?
yukondude
1
@yukondude: Tu as raison. La version de find que j'ai localement - GNU 4.4.0 - l'a, contrairement à 4.1.20 que j'ai sur Dreamhost. Le kludge avec la création de deux fichiers devrait fonctionner dans l'un ou l'autre, cependant.
Arve
1
Sur certains systèmes (FreeBSD, OS / X ...) -newerBtcorrespondra à l' heure de naissance (création) du fichier .
Stephane Chazelas
3
Notez que le -newerxtest disponible sur FreeBSD depuis 2001 (où il a été fourni pour la première fois en tant que correctif en 1998), quelques autres BSD et GNU find (depuis 4.3.3 en 2007), basés sur HP / UX find, qui a introduit -newerXY(mais où Y == t n'est pas pris en charge).
Stéphane Chazelas
En utilisant: find (GNU findutils) 4.4.0, cette syntaxe ne fonctionne pas sur SUSE ext3, si elle est censée répertorier les fichiers / w mtime à cette date, elle ne renvoie rien
niken
68

find location -ctime time_period

Exemples de time_period:

  • Il y a plus de 30 jours: -ctime +30

  • Il y a moins de 30 jours: -ctime -30

  • Il y a exactement 30 jours: -ctime 30

Chris
la source
7
Le problème est que je veux tester pour une date spécifique, pas dans une période de temps.
sverrejoh
1
Donc, déterminez combien il y a de jours et utilisez ce nombre.
jmanning2k
15
ctimen'a rien à voir avec le temps de création , c'est le temps de changement d'inode.
Stephane Chazelas
47

C'est deux étapes mais j'aime le faire de cette façon:

Créez d'abord un fichier avec une date / heure particulière. Dans ce cas, le dossier est le 2008-10-01 à minuit

touch -t 0810010000 /tmp/t

Maintenant, nous pouvons trouver tous les fichiers plus récents ou plus anciens que le fichier ci-dessus (en fonction de la date de modification du fichier. Vous pouvez également utiliser -anewer pour accéder et -cnewer fichier statut changé).

find / -newer /tmp/t
find / -not -newer /tmp/t

Vous pouvez également consulter des fichiers entre certaines dates en créant deux fichiers avec contact

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

Cela trouvera des fichiers entre les deux dates et heures

find / -newer /tmp/t1 -and -not -newer /tmp/t2
Mark Biek
la source
3
+1 pour solution à un ancien findqui manque-newerXY
Felipe Alvarez
1
OMI, en ce moment, cela devrait être la solution acceptée. Je n'ai pas pu faire fonctionner -newermt sur le noyau 2.6.18-348.18.1.el5, sans parler des noyaux plus récents.
DarkForce
Même chose ici DarkForce, la fonctionnalité newermt semble être très très
bancale
34

Vous pouvez faire ceci:

find ./ -type f -ls |grep '10 Sep'

Exemple:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24
Jeff MacDonald
la source
C'est ce que la plupart des gens veulent, mais il n'a pas reçu suffisamment de votes positifs !!!
2015
2
cela peut ne pas fonctionner si vous disposez de quelques millions de fichiers dans un seul répertoire.
Dennis Nolte
3
Il y a des effets secondaires si le terme de recherche grep est dans le nom du fichier.
Snorex
mywiki.wooledge.org/ParsingLs - une meilleure approche consiste probablement à imprimer la date de création sous une forme lisible par machine, peut-être avec statsi vous ne l'avez pas find -printf.
tripleee
12

Tu ne peux pas. Le commutateur -c vous indique quand les autorisations ont été modifiées pour la dernière fois, -a teste l'heure d'accès la plus récente et -m teste l'heure de modification. Le système de fichiers utilisé par la plupart des versions de Linux (ext3) ne prend pas en charge un enregistrement "heure de création". Désolé!

Max Cantor
la source
7
En fait, ce n'est pas seulement le type de système de fichiers - il n'y a pas d'interface système pour obtenir de telles informations, même si le système de fichiers les détenait. L'une des lacunes d'Unix remontant aux premiers jours, c'est pourquoi Unix ne décollera jamais.
chrisdowney
1
Unix ne décollera jamais?
lucid_dreamer
8

@Max: a raison sur le temps de création.

Toutefois, si vous voulez calculer l'argument jours écoulé pour l' un des -atime, -ctime, des -mtimeparamètres, vous pouvez utiliser l'expression suivante

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Remplacez «2008-09-24» par la date de votre choix et ELAPSED_DAYS sera défini sur le nombre de jours entre cette date et aujourd'hui. (Mise à jour: soustrayez un du résultat pour l'aligner avec findl'arrondissement de la date de.)

Donc, pour trouver un fichier modifié le 24 septembre 2008, la commande serait:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Cela fonctionnera si votre version de findne prend pas en charge les -newerXYprédicats mentionnés dans la réponse de @Arve :.

yukondude
la source
2

Avec les commutateurs -atime, -ctime et -mtime à rechercher, vous pouvez vous rapprocher de ce que vous voulez réaliser.

ayaz
la source
-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
Tintin
la source
1
Pourquoi copiez-vous les fichiers? Outre la commande en `ls ...`travaux, il n'utilise pas l' findoutil.
Yamaneko
-5

J'ai trouvé ce scriplet dans un script qui supprime tous les fichiers de plus de 14 jours:

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

Je pense qu'un peu de "man find" supplémentaire et la recherche des paramètres -ctime / -atime etc. vous aideront ici.

Georgi
la source