OVH Cloud OVH Cloud

déplacer des fichiers à partir d'une certaine date

20 réponses
Avatar
fabrice régnier
Salut la liste ;)

J'aimerai de façon élégante (pas un prog de 40 lignes) pouvoir déplacer
des fichiers d'un répertoire vers un autre en fonction de la date de
création des fichiers.

ex: déplacer tous les fichiers de toto/ crées après le 15/08/2005 vers titi/

merci

f.

10 réponses

1 2
Avatar
Stephane Chazelas
On Wed, 24 Aug 2005 16:59:08 +0200, Jean-Louis Liagre wrote:
[...]
man 2 stat
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
^^^^^^
CHANGE, pas création!


Les scripts proposés remplissent parfaitement la tâche qui leur est
demandée si les fichiers ne sont pas modifiés après leur création.

Dans ce cas le last change est bien la date de création.
[...]


Je pense que tu voulais dire "last modification" au lieu de
"last change" ci dessus. Le last change est mis a jour a chaque
modification de l'inode, ca comprend donc tous les chmod et les
access (read).

Sinon, le mtime est la date du dernier write, pas du dernier
open en WRONLY ou RDWR. Il n'y a guere que la date de derniere
modification du directory contenant le fichier qui puisse donner
une idee de la date de creation.

--
Stephane


Avatar
Jean-Louis Liagre
Pascal Bourguignon wrote:
Jean-Louis Liagre writes:


Pascal Bourguignon wrote:

fabrice régnier writes:


J'aimerai de façon élégante (pas un prog de 40 lignes) pouvoir
déplacer des fichiers d'un répertoire vers un autre en fonction de la
date de création des fichiers.

ex: déplacer tous les fichiers de toto/ crées après le 15/08/2005 vers titi/


Ce n'est pas possible. (En tout cas, pas facilement).
Unix ne garde pas la date de création de ses fichiers!
man 2 stat
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
^^^^^^
CHANGE, pas création!


Les scripts proposés remplissent parfaitement la tâche qui leur est
demandée si les fichiers ne sont pas modifiés après leur création.

Dans ce cas le last change est bien la date de création.

C'est en effet une contrainte, mais elle ne suffit à affirmer que
c'est "tout faux".



Seulement s'il se passe moins d'une seconde entre la création et la
dernière modification... ;-)


Relisez ce que j'ai écrit:

"si les fichiers ne sont pas modifiés après leur création"




Avatar
Jean-Louis Liagre
Stephane Chazelas wrote:
On Wed, 24 Aug 2005 16:59:08 +0200, Jean-Louis Liagre wrote:
[...]

man 2 stat
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
^^^^^^
CHANGE, pas création!


Les scripts proposés remplissent parfaitement la tâche qui leur est
demandée si les fichiers ne sont pas modifiés après leur création.

Dans ce cas le last change est bien la date de création.


[...]

Je pense que tu voulais dire "last modification" au lieu de
"last change" ci dessus.


C'est exact, merci de cette correction.

man find:
...
-newer file True if the current file has been modified
more recently than the argument file.

La doc Solaris distingue mieux mtime et ctime:

time_t st_atime; /* Time of last access */
time_t st_mtime; /* Time of last data modification */
time_t st_ctime; /* Time of last file status change */


Le last change est mis a jour a chaque
modification de l'inode, ca comprend donc tous les chmod et les
access (read).


Sauf si "mount -noatime" pour les reads, mais ce n'est pas POSIX ...

Sinon, le mtime est la date du dernier write, pas du dernier
open en WRONLY ou RDWR. Il n'y a guere que la date de derniere
modification du directory contenant le fichier qui puisse donner
une idee de la date de creation.


S'il n'y a qu'un fichier dans le répertoire ...



Avatar
Pascal Bourguignon
Jean-Louis Liagre writes:

Pascal Bourguignon wrote:
Jean-Louis Liagre writes:

Pascal Bourguignon wrote:

fabrice régnier writes:


J'aimerai de façon élégante (pas un prog de 40 lignes) pouvoir
déplacer des fichiers d'un répertoire vers un autre en fonction de la
date de création des fichiers.

ex: déplacer tous les fichiers de toto/ crées après le 15/08/2005 vers titi/


Ce n'est pas possible. (En tout cas, pas facilement).
Unix ne garde pas la date de création de ses fichiers!
man 2 stat
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
^^^^^^
CHANGE, pas création!


Les scripts proposés remplissent parfaitement la tâche qui leur est
demandée si les fichiers ne sont pas modifiés après leur création.

Dans ce cas le last change est bien la date de création.

C'est en effet une contrainte, mais elle ne suffit à affirmer que
c'est "tout faux".
Seulement s'il se passe moins d'une seconde entre la création et la

dernière modification... ;-)


Relisez ce que j'ai écrit:

"si les fichiers ne sont pas modifiés après leur création"


Les seuls fichiers qui ne sont pas modifiés après leur création sont
des fichiers vide.
Par exemple:

touch toto
# mtime = create time.

Mais:

( echo hello ; sleep 10 ; echo world ) > titi
# create = 01:24:25; mtime= 01:24:35


--
__Pascal Bourguignon__ http://www.informatimago.com/
Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we. -- Georges W. Bush





Avatar
Jean-Louis Liagre
Pascal Bourguignon wrote:
Jean-Louis Liagre writes:


Pascal Bourguignon wrote:

Jean-Louis Liagre writes:


Pascal Bourguignon wrote:


fabrice régnier writes:



J'aimerai de façon élégante (pas un prog de 40 lignes) pouvoir
déplacer des fichiers d'un répertoire vers un autre en fonction de la
date de création des fichiers.

ex: déplacer tous les fichiers de toto/ crées après le 15/08/2005 vers titi/


Ce n'est pas possible. (En tout cas, pas facilement).
Unix ne garde pas la date de création de ses fichiers!
man 2 stat
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
^^^^^^
CHANGE, pas création!


Les scripts proposés remplissent parfaitement la tâche qui leur est
demandée si les fichiers ne sont pas modifiés après leur création.

Dans ce cas le last change est bien la date de création.

C'est en effet une contrainte, mais elle ne suffit à affirmer que
c'est "tout faux".


Seulement s'il se passe moins d'une seconde entre la création et la
dernière modification... ;-)


Relisez ce que j'ai écrit:

"si les fichiers ne sont pas modifiés après leur création"



Les seuls fichiers qui ne sont pas modifiés après leur création sont
des fichiers vide.
Par exemple:

touch toto
# mtime = create time.

Mais:

( echo hello ; sleep 10 ; echo world ) > titi
# create = 01:24:25; mtime= 01:24:35


Ca se discute, on peut aussi considérer que le fichier n'a pas
"fini d'être créé" durant son écriture initiale, et ce la création
est l'instant du premier close.

De toute façon, la question initiale ne demande pas une précision à la
seconde, il s'agit d'une journée, ce qui laisse le temps d'écrire
un gros fichier !

S'il s'agit d'une question théorique, vous et Stéphane avez raison,
s'il s'agit d'un cas pratique, seul Fabrice pourra nous dire si le
script proposé répond à son attente.






Avatar
Stephane Chazelas
2005-08-24, 20:47(+02), Jean-Louis Liagre:
[...]
Seulement s'il se passe moins d'une seconde entre la création et la
dernière modification... ;-)


Relisez ce que j'ai écrit:

"si les fichiers ne sont pas modifiés après leur création"


S'ils sont vides, en somme, donc.

--
Stéphane


Avatar
Jean-Louis Liagre
Stephane Chazelas wrote:
2005-08-24, 20:47(+02), Jean-Louis Liagre:
[...]

Seulement s'il se passe moins d'une seconde entre la création et la
dernière modification... ;-)


Relisez ce que j'ai écrit:

"si les fichiers ne sont pas modifiés après leur création"



S'ils sont vides, en somme, donc.



Une création à une durée, libre à vous de décider que le
début de cette opération est à prendre en compte et laissez
moi penser que le fichier n'est à considérer comme créé qu'à
la fin de cette opération.

Ces deux instants sont de toute façon le plus souvent
confondus quand la précision de la mesure est d'une journée,
comme c'est le cas pour la question qui nous occupe.

Si vous voulez vraiment pousser le raisonnement, alors ces
timestamps ne représentent pas non plus les instants précis
de ce qu'ils indiquent, car il s'écoule un certain temps
entre la lecture de l'horloge, et l'écriture de cette
valeur dans le répertoire, et ce d'autant plus si un
système de journalisation est en place.

D'autre part, la date de création d'un fichier est une
notion ambiguë, si j'ai des photos au jormat JPEG avec
une en-tête EXIF par exemple, la date de création à
prendre en compte est peut-être celle indiquée dans
l'EXIF, pas celle du file-system.



Avatar
Stephane Chazelas
On Thu, 25 Aug 2005 10:03:46 +0200, Jean-Louis Liagre wrote:
[...]
Une création à une durée, libre à vous de décider que le
début de cette opération est à prendre en compte et laissez
moi penser que le fichier n'est à considérer comme créé qu'à
la fin de cette opération.
[...]


la fin d'un open avec O_CREAT ou d'un creat?

C'est vrai qu'on joue sur les mots. On peut aussi considerer que
la date de creation de /a/b/c est la date a laquelle "c" a ete
attaché a "a/b" ou si a ou b sont des symlinks crees apres
l'inode de "c", que la date de "/a/b/c" est la date de creation
du plus recent de ces "fichiers" ("directory entry", pas
"inode")...

Si je fais mv a b, quelle devrait etre la date de creation de
"b" (et si je fais la meme operation across 2 filesystems, et si
le fichier "b" existait deja sur l'autre filesystem...).

Considere-t-on que la creation d'un inode et son attachement a
un repertoire est "atomique"?

--
Stephane

Avatar
Pascal Bourguignon
Stephane Chazelas writes:

On Thu, 25 Aug 2005 10:03:46 +0200, Jean-Louis Liagre wrote:
[...]
Une création à une durée, libre à vous de décider que le
début de cette opération est à prendre en compte et laissez
moi penser que le fichier n'est à considérer comme créé qu'à
la fin de cette opération.
[...]


la fin d'un open avec O_CREAT ou d'un creat?

C'est vrai qu'on joue sur les mots. On peut aussi considerer que
la date de creation de /a/b/c est la date a laquelle "c" a ete
attaché a "a/b" ou si a ou b sont des symlinks crees apres
l'inode de "c", que la date de "/a/b/c" est la date de creation
du plus recent de ces "fichiers" ("directory entry", pas
"inode")...

Si je fais mv a b, quelle devrait etre la date de creation de
"b" (et si je fais la meme operation across 2 filesystems, et si
le fichier "b" existait deja sur l'autre filesystem...).


Exactement. Considérer: cat a > b vs. mv a b vs. rm b;mv a b

Considere-t-on que la creation d'un inode et son attachement a
un repertoire est "atomique"?


Les inodes existent. (Ils sont créés au moment du mkfs).

L'attachement d'un inode auparavent inutilisé à un répertoire est atomique.
(voir creat(2), link(2), rename(2), etc).


Enfin, c'est parce que cette notion de création d'un fichier est
effectivement trés ambigüe que les créateurs d'unix ont jugé qu'il
était préférable de ne pas attacher de date de création aux inodes.


--
__Pascal Bourguignon__ http://www.informatimago.com/
Grace personified,
I leap into the window.
I meant to do that.


Avatar
fabrice régnier
ouf, quel thread ;) merci à tous.

Voici comment j'ai fait:

Il se trouve qu'un numéro de séquence (fonction de la "date de
création") se trouve dans le nom des fichiers. J'ai donc simplement
déplacer tous les fichiers dont le nom contient un motif précis. Par
exemple, "00003" désigne tous les fichiers entre le n° 0000300 et
0000399. C'est pas très glorieux mais ça a été rapide pour moi.*

Ma question était surtout destinée à des fichiers qui ont des noms
quelconques et vous m'avez donné une réponse satisfaisante. merci donc ;)

a+

f.
1 2