Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/07/2011, à 17:37

Mpok

[Résolu] Modification de dates (avec touch)

Bonjour,

J'ai un répertoire avec plusieurs fichiers. Je souhaite modifier leur date de modification (avec "touch -t [time] [fichier]") afin qu'ils soient plus ou moins répartis entre la date la plus ancienne et la date la plus récente.
Exemple pour comprendre : supposons que j'ai 5 fichiers, le plus récent date d'aujourd'hui, le plus ancient date d'il y a 2 ans. Il s'agit dans ce cas de modifier la date des trois fichiers intermédiaires pour qu'ils aient des dates intermédiaires et équidistantes, donc en l'occurrence : -18 mois, -12 mois et -6 mois.

Ce qui est fait :
- la sauvegarde des dates actuelles dans un script de sauvegarde (on ne sait jamais…).
- la détermination de la date la plus récente et de la date la plus ancienne.
- le parcours des fichiers selon leur date et l'incrémentation régulière d'une variable de temps.

Problème :
Pour l'instant, mes calculs se font sous forme décimale.
Je récupère une valeur du genre YYMMDDHHMM, et je fais les calculs (différence, puis division sur le nombre de fichiers) là-dessus.
Cela me permet de vérifier le principe, mais évidemment ça ne marche pas wink  : il faut que les calculs se fassent sous forme calendaire (avec gestion des heures, des mois, des années bisextiles, etc…).

=> connaissez-vous une méthode facile pour effectuer des calculs sur les dates ? (soustraction, addition, division).

Dernière modification par Mpok (Le 03/08/2011, à 19:43)

Hors ligne

#2 Le 24/07/2011, à 18:45

FRUiT

Re : [Résolu] Modification de dates (avec touch)

De bonnes infos .


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#3 Le 24/07/2011, à 21:01

Mpok

Re : [Résolu] Modification de dates (avec touch)

Ok, merci FRUit… smile
J'ai parcouru rapidement les liens (je ferai une étude plus précise demain).

Mais il semble (d'après ma première lecture rapide) qu'il n'y ait pas de commande de conversion (en secondes par exemple) disponible.
Du coup, j'ai l'impression (pour l'instant au moins) qu'il faut que je passe par un prog C (car là, je sais que je vais y arriver, même si je galère un peu au début).

Et si je dois passer par un prog en C pour la gestion des temps, autant faire l'ensemble en C, ce que j'aurais voulu éviter

Hors ligne

#4 Le 24/07/2011, à 22:53

gerarmentor

Re : [Résolu] Modification de dates (avec touch)

(sans avoir lu le lien)
il existe des commandes pour convertir (date, gawk...), mais pour ce que tu veux faire, il n'y a même pas besoin : il suffit de travailler uniquement à partir des posix timestamps des fichiers.

Une piste :

ls -rtl --time-style +%s | awk 'NR!=1{print substr($0,index($0,$6))}'

Ca t'affiche la liste des fichiers, timestamp unix suivi du nom, du plus ancien au plus récent.

En mettant cette liste dans un fichier, ça te sert à la fois de sauvegarde et de fichier de travail :
- compter les lignes.
- récupérer le timestamp le plus ancien et le plus récent (première et dernière ligne du fichier) et faire la différence pour calculer la moyenne en utilisant le nombre de lignes

Ensuite boucler le contenu du fichier (ou à partir de "ls -1rt") pour changer le timestamp des fichiers.

touch -d @$nouveau_timestamp "$fichier"

Dernière modification par gerarmentor (Le 24/07/2011, à 23:13)

Hors ligne

#5 Le 25/07/2011, à 04:39

sputnick

Re : [Résolu] Modification de dates (avec touch)

gerarmentor a écrit :
ls -rtl --time-style +%s | awk 'NR!=1{print substr($0,index($0,$6))}'

Ya plus propre que piper ls :

find -printf '%Ts %p\n'

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#6 Le 25/07/2011, à 05:58

gerarmentor

Re : [Résolu] Modification de dates (avec touch)

Si on part sur le principe que j'ai donné, on doit quand même piper le résultat puisque find ne trie pas du plus  ancien au plus récent :

find -printf '%Ts %p\n' | sort -n

Sinon on peut le faire aussi avec la commande stat :

stat -c"%Y %n" * | sort -n

Hors ligne

#7 Le 25/07/2011, à 06:38

sputnick

Re : [Résolu] Modification de dates (avec touch)

wé, je parle d'éviter de piper

ls

, bien sur il faut trier sinon.

IRC #bash sur freenode bot said :

[06:38] <greybot> ls shows you a representation of files. They are NOT file names (for simple names, they mostly happen to be equivalent). Do NOT try to parse it. http://mywiki.wooledge.org/ParsingLs


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#8 Le 25/07/2011, à 07:14

gerarmentor

Re : [Résolu] Modification de dates (avec touch)

Si on évite de parser "ls" à cause des sauts de lignes qui peuvent être contenus dans le nom de fichier (le seul exemple donné dans cette page de nom improprement rendu), dans ce cas il faut tout autant éviter d'utiliser "\n" comme délimiteur avec "find" ou "stat", car cela conduirait au même souci.

Il faut alors utiliser le caractère null :

stat --printf="%Y %n\0" * | sort -nz
find -printf '%Ts %p\0' | sort -nz

Dernière modification par gerarmentor (Le 25/07/2011, à 07:15)

Hors ligne

#9 Le 25/07/2011, à 07:54

sputnick

Re : [Résolu] Modification de dates (avec touch)

Les implémentations de

ls

peuvent différer d'un *nix à un autre. En gros c'est pas portable


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#10 Le 25/07/2011, à 12:11

gerarmentor

Re : [Résolu] Modification de dates (avec touch)

C'est la même chose avec les implémentations de "find".
"*BSD find" ne supporte pas l'option -printf d'après ce que j'ai lu, idem avec Solaris.

Dernière modification par gerarmentor (Le 25/07/2011, à 19:32)

Hors ligne

#11 Le 27/07/2011, à 07:25

Mpok

Re : [Résolu] Modification de dates (avec touch)

@gerarmentor, @sputnick : merci, vous êtes géniaux !! big_smile

J'ai appris 3 nouvelles méthodes pour faire ce que je cherchais à faire (en fait, deux, plus une option : j'en étais resté au ls -rtl, j'ignorais l'option --time-style)… tongue
Bon, le script n'est pas encore fait, mais MAINTENANT j'ai toutes les bases pour l'écrire, ça va marcher.

Du coup, je vais probablement utiliser le find plutôt que le ls comme actuellement, cela permettra une meilleure généralisation (même si dans ce cas concret, je n'ai pas besoin de récursion, c'est un "plus" apporté facilement par find).

Reste néanmoins à trouver la commande inverse. EDIT : ok, j'ai trouvé. date -d avec le format adh'oc pour touch…

Mon problème de calcul sur les dates est en tout cas résolu (merci encore à vous deux).

PS : je note également l'excellente remarque de gerarmentor sur les sauts de ligne, même si ce n'est pas utile dans mon cas (ça me servira peut-être plus tard). Nice one…

Hors ligne

#12 Le 27/07/2011, à 09:11

sputnick

Re : [Résolu] Modification de dates (avec touch)

U're welcome ^^


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#13 Le 30/07/2011, à 03:15

Mpok

Re : [Résolu] Modification de dates (avec touch)

Bon, c'est presque fini, mais j'ai encore un problème… neutral

Le calcul est ok, l'incrémentation sur le parcours des fichiers est ok, bref c'est tout bon.
Sauf que je n'arrive pas à convertir les dates finales… hmm

Les "timestamps" semblent ok (vérification rapide) mais il me faut un format YYMMDDHHMM pour touch, et c'est là que je bloque.
Je pensais le faire avec "date", mais ça ne marche pas ("date invalide"…).
Un peu énervé après de nombreux tests, j'ai même essayé de faire un programme de conversion en C (une dizaine de lignes au total), mais là aussi, ça merde (bon, ça fait longtemps que je n'ai pas touché au C, donc je n'ai peut-être plus les bons réflexes, mais je pensais qu'une unique fonction ne poserait pas de problème ; ben non, j'ai pas réussi à utiliser ctime()… sad).

>> il me faut juste une commande permettant de convertir un timestamp en une date au format YYMMDDHHMM.
Ou bien des précisions sur l'utilisation de la fonction ctime (ou tout autre commande de conversion de date) en C (parce que chez moi elle donne des résultats incohérents).

Dernière modification par Mpok (Le 30/07/2011, à 03:17)

Hors ligne

#14 Le 30/07/2011, à 10:23

Postmortem

Re : [Résolu] Modification de dates (avec touch)

Salut,

ls -l examples.desktop
-rw-r--r-- 1 xxxxx xxxxx 179 2011-05-13 09:07 examples.desktop

ls -l --time-style +%s examples.desktop
-rw-r--r-- 1 xxxxx xxxxx 179 1305270457 examples.desktop

date -d @1305270457 "+%Y%m%d%H%M"
201105130907

EDIT : Et merci d'avoir créé ce sujet qui m'a permis d'apprendre des trucs encore une fois !

Dernière modification par Postmortem (Le 30/07/2011, à 10:25)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#15 Le 30/07/2011, à 18:58

gerarmentor

Re : [Résolu] Modification de dates (avec touch)

Mpok a écrit :

Les "timestamps" semblent ok (vérification rapide) mais il me faut un format YYMMDDHHMM pour touch, et c'est là que je bloque.

Non, comme je l'avais indiqué dans mon premier message, tu peux très bien utiliser directement le timestamp unix avec "touch" : 

touch -d @1305270457 "$fichier"

.

Petite demonstration :

$ >fichier
$ stat -c%y fichier
2011-07-30 18:54:32.039934368 +0200
$ touch -d @1305270457 fichier
$ stat -c%y fichier
2011-05-13 09:07:37.000000000 +0200
$ stat -c%Y fichier
1305270457

Dernière modification par gerarmentor (Le 30/07/2011, à 19:03)

Hors ligne

#16 Le 03/08/2011, à 19:43

Mpok

Re : [Résolu] Modification de dates (avec touch)

Ok, merci.
C'est le "@" qui me manquait au niveau de la syntaxe (que ce soit pour 'date' ou pour 'touch' directement).

Résolu. smile

Hors ligne