OVH Cloud OVH Cloud

date fichiers

5 réponses
Avatar
Gérard Grondin
Bonsoir,

Comment avec find trouver les fichiers modifiés à une certaine date par
exemple 2004-10-10, comment insérer ce paramètre date dans la commande find
Parce là je sèche ...

merci.

5 réponses

Avatar
Stephane Chazelas
2006-01-10, 21:43(+01), Gérard Grondin:
Comment avec find trouver les fichiers modifiés à une certaine date par
exemple 2004-10-10, comment insérer ce paramètre date dans la commande find
Parce là je sèche ...
[...]


On peut pas. A moins de creer deux fichiers (avec touch -t
....), avec des dates un a minuit le matin, un a minuit le
lendemain, et d'utiliser ! -older file1 -older file2.

Sinon, tu peux utiliser les find et awk de GNU:

find . -printf '%p%TY%Tm%Td' |
awk -v RS='' '
{
getline date
if (date == 20041010) print
}'

Sinon, utiliser perl ou zsh:

zmodload zsh/stat

print -rl -- **/*(De{'
stat -f %Y%m%d -H s -- $REPLY
[[ $s[mtime] = 20041010 ]]'})

--
Stéphane

Avatar
Pascal Bourguignon
Gérard Grondin writes:
Comment avec find trouver les fichiers modifiés à une certaine date
par exemple 2004-10-10, comment insérer ce paramètre date dans la
commande find
Parce là je sèche ...



On ne peut spécifier qu'un nombre de jours, AMC.

Il faut donc calculer le nombre de jours entre la date voulue et la
date courante, ce qui est trivial:


#!/bin/bash

function year-to-day () {
local y=$1
local q=$(( $y % 400 ))
local c=$(( $q % 100 ))
local a=$(( $c % 4 ))
local i
if [ $q = 0 -o ( $c != 0 -a $a = 0 ) ] ; then i=0 ; else i=1 ; fi
echo $(( ( $y / 400 ) * 146097 + ( $q / 100 ) * 36524 + ( $c / 4 ) * 1461 + a * 365 + $i ))
}

function leap-year () {
echo $(( ( 0 == ( $1 % 400 ) ) || ( ( 0 != ( $1 % 100) ) && ( 0 == ( $1 % 4 ) ) ) ))
}

days=(0 0 31 59 90 120 151 181 212 243 273 304 334)
function month-to-day () {
local y=$1
local m=$2
if [ $m -gt 2 ] ; then
echo $(( $(leap-year $y) + ${days[$m]} ))
else
echo ${days[$m]}
fi
}

function date-to-day () {
local y=$1
local m=$2
local d=$3
echo $(( $(year-to-day $y) + $(month-to-day $y $m) + $d ))
}

function date-diff () {
local y1=$1
local m1=$2
local d1=$3
local y2=$4
local m2=$5
local d2=$6
echo $(( $(date-to-day $y1 $m1 $d1) - $(date-to-day $y2 $m2 $d2) ))
}



find $DIR -mtime $(date-diff $(date +%Y) $(date +%m) $(date +%d) 2004 10 10)



--
__Pascal Bourguignon__ http://www.informatimago.com/

HEALTH WARNING: Care should be taken when lifting this product,
since its mass, and thus its weight, is dependent on its velocity
relative to the user.

Avatar
Stephane Chazelas
On Tue, 10 Jan 2006 23:40:11 +0100, Pascal Bourguignon wrote:
Gérard Grondin writes:
Comment avec find trouver les fichiers modifiés à une certaine date
par exemple 2004-10-10, comment insérer ce paramètre date dans la
commande find
[...]


find $DIR -mtime $(date-diff $(date +%Y) $(date +%m) $(date +%d) 2004 10 10)
[...]


Ca ne marchera pas en general. D'apres POSIX, -mtime 1, c'est
les fichiers modifies entre hier a la meme heure que maintenant
et avant-hier a la meme heure que maintenant.

Le find de Solaris se comporte differemment (modifies entre hier
0:0 et hier la meme heure), mais ca ne convient toujours pas.

Le GNU find a l'option -daystart pour ca.

--
Stephane


Avatar
Stephane Chazelas
On 11 Jan 2006 07:26:13 +0100, Etienne de Tocqueville wrote:
Gérard Grondin writes:

Comment avec find trouver les fichiers modifiés à une certaine date par
exemple 2004-10-10, comment insérer ce paramètre date dans la commande
find


Si tu cherche les fichiers modifier à une certaine date (et non à partir
d'une certaine date) c'est faisable avec n'importe quel find (avec
l'option -ls) suivi d'un grep sur la date voulue

find * -ls | grep "Dec 20 ..:.."
[...]


Et si le nom du fichier, de l'utilisateur, du groupe, du lien
sur lequel pointe le lien symbolique contient "Dec 20"?

Et si les noms de fichiers sont sur plusieurs lignes?

--
Stephane


Avatar
Paul Gaborit
À (at) 12 Jan 2006 07:42:41 +0100,
Etienne de Tocqueville écrivait (wrote):
Et alors ?... Sous prétexte qu'il existe 1 ou 2 cas tordus qui mettent
ma ligne de commande en défaut, j'aurais dû la cacher à l'OP, alors que
cette réponse lui convient très certainement tout a fait ?

En tout cas, j'ai souvent eu besoin de faire cette recherche, et ça a
parfaitement répondu à mon besoin. Ce qui est important, c'est qu'on ne
passe à coté d'aucun fichier, et si certains fichiers sortent à tord, on
les voit très rapidement d'un seul coup d'oeil.


Jusque là... d'accord avec vous : une commande simple à retenir, même
si elle n'est pas très robuste face à certains cas tordus/rares,
dépanne bien. Ce qui compte c'est que celui qui l'utilise en connaisse
les limites. Au pire, il en assume les conséquences... ;-)

Quant aux fichiers sur plusieurs lignes qui mettent en défaut la
quasi-totalité des scripts manipulant des noms fichiers, il faudrait un
jour arréter ce délire : c'est un cas qu'on ne rencontre jamais, même si
c'est théoriquement possible.


Là, plus d'accord du tout ! Un script (et non pas une commande tapée
par un être humain devant son terminal) ne peut évidemment pas "voir
très rapidement d'un seul coup d'oeil" que la sortie est erronée !
Conséquences éventuelles : des gros trous de sécurité, des patchs qui
marchent chez "presque" tout le monde sauf les quelques malheureux qui
ont un "espace" dans le nom d'un répertoire (cas réel d'une mise à
jour chez Apple), etc.

Et si vraiment on est paranoïaque, rien n'empêche de vérifier avant
qu'on n'est pas dans ce cas là.


Comment fait le script pour vérifier qu'il n'est pas dans le cas où ça
ne marche pas ? Il vaut mieux écrire un script robuste.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>