web-dev-qa-db-fra.com

Grep dans tous les fichiers créés dans la plage de dates

Je suis sur le système d'exploitation Ubuntu. Je veux grep un mot (disons XYZ) à l'intérieur de tous les fichiers journaux qui sont créés dans la plage de dates du 28 mai 2012 au 30 mai 2012.

Comment je fais ça?

25
Vijayendra Bapte

C'est un peu différent de la solution de Banthar, mais cela fonctionnera avec les versions de find qui ne prennent pas en charge -newermt et montre comment utiliser la commande xargs, qui est un outil très utile.

Vous pouvez utiliser la commande find pour localiser les fichiers "d'un certain âge". Cela trouvera tous les fichiers modifiés entre 5 et 10 jours:

 find /directory -type f -mtime -10 -mtime +5

Pour ensuite rechercher une chaîne dans ces fichiers:

 find /directory -type f -mtime -10 -mtime +5 -print0 |
   xargs -0 grep -l expression

Vous pouvez également utiliser le -exec switch, mais je trouve xargs plus lisible (et il fonctionnera souvent mieux aussi, mais peut-être pas dans ce cas).

(Notez que le -0 L'indicateur est là pour laisser cette commande fonctionner sur des fichiers avec des espaces intégrés, tels que this is my filename.)

Mise à jour de la question dans les commentaires

Lorsque vous fournissez plusieurs expressions à find, elles sont AND ensemble. Par exemple, si vous demandez:

find . -name foo -size +10k

...find ne renverra que les fichiers qui sont à la fois (a) nommés foo et (b) plus grands que 10 kilo-octets. De même, si vous spécifiez:

find . -mtime -10 -mtime +5

...find ne renverra que les fichiers qui sont (a) plus récents qu'il y a 10 jours et (b) plus anciens qu'il y a 5 jours .

Par exemple, sur mon système, il est actuellement:

$ date
Fri Aug 19 12:55:21 EDT 2016

J'ai les fichiers suivants:

$ ls -l
total 0
-rw-rw-r--. 1 lars lars 0 Aug 15 00:00 file1
-rw-rw-r--. 1 lars lars 0 Aug 10 00:00 file2
-rw-rw-r--. 1 lars lars 0 Aug  5 00:00 file3

Si je demande "des fichiers modifiés il y a plus de 5 jours (-mtime +5) Je reçois:

$ find . -mtime +5
./file3
./file2

Mais si je demande "des fichiers modifiés il y a plus de 5 jours mais moins de 10 jours" (-mtime +5 -mtime -10), Je reçois:

$ find . -mtime +5 -mtime -10
./file2
34
larsks

Combinez grep avec find :

find -newermt "28 May 2012" -not -newermt "30 May 2012" -exec grep XYZ \{\} \;
15
Piotr Praszmo