Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Modification de la date d'un fichier

37 réponses
Avatar
lionmarron
Bonjour,

Existe-t-il une instruction qui permettrait de modifier la date de
création d'un fichier ?

Ce n'est pas précisément le sujet mais à tout hasard j'explique pour
quoi c'est faire : j'ai enregistré des mails dans un dossiers et pour
des raisons que je ne tiens pas à connaître (soyons modestes) cela
marche mais pas d'une façon très habituelle. Les noms de fichiers sont
plutôt bizarre (franchement long), et les dates de création sont
devenues la date du jour de la copie (ce qui ne m'arrange pas pour les
opérations de tri par exemple).

--
lionmarron

10 réponses

1 2 3 4
Avatar
Nicolas George
Benoit Izac , dans le message , a écrit :
Ton assertion semble fausse si l'on considère ext4 comme un système de
fichier prévu pour Unix (champ crtime).



Ah oui, tiens. Je me demande ce à quoi ça va bien pouvoir servir.
Avatar
Sergio
Le Tue, 07 May 2013 20:58:10 +0200, Francois Lafont a écrit :

Peut-être qu'il existe des systèmes de fichiers, pris en charge par
Linux, et qui stockent la date de création d'un fichier. Si ça existe,
je serais curieux d'avoir des exemples.



... et peut-être serait totalement absurde : Souvent le processus de
modification d'un fichier revient à :
- Lire le fichier original
- Le modifier dans un fichier temporaire
- Effacer (ou renommer) l'ancien fichier
- Renommer le fichier temporaire du nom de l'ancien

Donc, la date de création serait ici la date de modification (et non
celle de l'original).
Avatar
Olivier B
Le 08/05/2013 01:44, Nicolas George a écrit :
Benoit Izac , dans le message , a écrit :
Ton assertion semble fausse si l'on considère ext4 comme un système de
fichier prévu pour Unix (champ crtime).



Ah oui, tiens. Je me demande ce à quoi ça va bien pouvoir servir.



Win12 le prendra comme système de fichier par défaut.
Hop.

--
Olivier B

<http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html>
Avatar
lionmarron
Le 08/05/2013 01:26, Francois Lafont a écrit :
Le 07/05/2013 23:38, lionmarron a écrit :

touch est bien la commande que je recherchais, donc merci pour la réponse.

Maintenant je vais essayer de faire quelque chose pour automatiser la
tache de façon à traiter tous les fichiers d'un répertoire.

Je sais pas si ce sera possible avec un fichier bash car les bonnes
dates se trouvent dans les noms de fichiers [...]



Évidemment, comme l'indique Benoît plus bas, c'est difficile d'en dire plus sans voir la tête de tes fichiers mais il y a de fortes chances pour que ce que tu veuilles faire soit parfaitement faisable (et peut-être aussi assez court à écrire) en shell avec des petits grep ou sed bien sentis.>



Voilà par exemple ce que donne cat sur un fichier pas trop long :

$ cat "Re_ police - lionmarron - 2013-03-16 1925.eml"
--------------------------------------------------------------------------------------------------------------------
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00800000
X-Mozilla-Keys:

Date: Sat, 16 Mar 2013 19:25:35 +0100
From: lionmarron
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130308
Thunderbird/17.0.4
MIME-Version: 1.0
Newsgroups: fr.comp.text.tex
Subject: Re: police
References: <51446024$0$2389$
<51446463$0$1994$
<5144b477$0$2206$
In-Reply-To: <5144b477$0$2206$
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Le 16/03/2013 19:05, St�phane Dutailly a �crit :

https://dl.dropbox.com/u/19889449/police.JPG

https://dl.dropbox.com/u/19889449/police.PDF



Je suis pas un sp�cialiste mais, sans chercher, j'ai tout de suite pens�
: �a ressemble � du Garamond.

La proposition de as marche aussi, et les police ressemblant � Garamond
�tant peut-�tre nombreuses (toujours sans avoir cherch�), je saurais pas
me prononcer davantage.

--
lionmarron
---------------------------------------------------------------------------------------------------------------

--
lionmarron
Avatar
Benoit Izac
Bonjour,

le 08/05/2013 à 09:55, lionmarron a écrit dans le message
<kmd0d2$mog$ :

Voilà par exemple ce que donne cat sur un fichier pas trop long :

$ cat "Re_ police - lionmarron - 2013-03-16 1925.eml"
[...]
Date: Sat, 16 Mar 2013 19:25:35 +0100



Déjà, il faut savoir quelle date tu veux mettre, celle qui est dans le
nom du fichier mais qui ne contient pas les secondes ainsi que le fuseau
horaire ou celle de la date affichée dans l'entête ? Dans le cas d'un
mail, tu pourrais aussi prendre la date du dernier « Received: ».

Pour la première solution, tu peux faire (non testé, remplace « touch » par
« echo touch » avant pour voir ce que ça donne) :

#!/bin/sh
for f in dossier_mail/*.eml; do
ftime=$(echo "$f" | sed -e 's/^.* - ([0-9]{4})-([0-9][0-9])-([0-9][0-9]) ([0-9]{4}).eml$/1234/')
touch -c -t "$ftime" "$f"
done

Pour la solution qui utilise une date contenu dans l'en-tête,
l'utilisation d'un langage de plus haut niveau, possédant des fonctions
permettant de lire des date me semble indispensable.

--
Benoit Izac
Avatar
Nicolas George
Francois Lafont , dans le message
<518a443a$0$3743$, a écrit :
Tu es sûr ? Je vais peut-être dire une bêtise mais sur ma Debian Squeeze
la valeur du champ "Date" dans le fichier .eml de Lionmarron semble bien
être acceptée par la commande :

~$ d=$(grep '^Date: ' fichier.eml | cut -d' ' -f'2-')
~$ touch -d "$d" titi



Si c'est GNU touch (des coreutils), oui, il arrive à parser à peu près
n'importe quelle syntaxe pour la date.
Avatar
Francois Lafont
Le 08/05/2013 14:52, Nicolas George a écrit :

~$ d=$(grep '^Date: ' fichier.eml | cut -d' ' -f'2-')
~$ touch -d "$d" titi



Si c'est GNU touch (des coreutils), oui, il arrive à parser à peu près
n'importe quelle syntaxe pour la date.



Ok. Alors si c'est le cas de Lionmrron, je propose ceci :

------------------------------------------
#!/bin/bash

DOSSIER_MAILS="/à/adapter/"

changer_date () {
date=$(grep '^Date: ' "$1" | cut -d' ' -f'2-')
touch -d "$date" "$1"
}

export -f changer_date

find "$DOSSIER_MAILS" -type f -name '*.eml' -exec bash -c 'changer_date "$1"' arg0 {} ;
------------------------------------------

C'est du bash non portable à cause du « export -f » et du fait que find n'accepte pas les fonctions directement dans l'option -exec (on a la même chose avec xargs d'ailleurs). Au passage, ce point là m'a toujours embêté (j'imagine que c'est une histoire de sécurité mais bon...) et je n'ai jamais trouver de solution propre sinon :

- faire un « export -f » comme ci-dessus mais c'est du bash pur jus (= non portable) et en plus au final dans le -exec on n'appelle pas la fonction directement mais le binaire bash;

- ou bien mettre la fonction dans un fichier exécutable séparé du script ci-dessus mais là aussi on n'appelle toujours pas une fonction dans le -exec mais un autre exécutable.

Bref, perso j'ai toujours regretté qu'on ne puisse pas utiliser une fonction dans le -exec de find (et dans xargs aussi). Je trouve que ça rendrait les choses plus simples et plus rapides aussi au niveau perf.

--
François Lafont
Avatar
Francois Lafont
Le 08/05/2013 15:50, Francois Lafont a écrit :

changer_date () {
date=$(grep '^Date: ' "$1" | cut -d' ' -f'2-')



Peut-être :

date=$(grep '^Date: ' "$1" | head -n1 | cut -d' ' -f'2-')

au cas où...

--
François Lafont
Avatar
Nicolas George
Francois Lafont , dans le message
<518a5832$0$2115$, a écrit :
changer_date () {
date=$(grep '^Date: ' "$1" | cut -d' ' -f'2-')
touch -d "$date" "$1"
}



Comme tu l'as vu, il vaut mieux insérer un head -n 1.

export -f changer_date

find "$DOSSIER_MAILS" -type f -name '*.eml' -exec bash -c 'changer_date "$1"' arg0 {} ;



Je conseillerais plutôt, en zsh :

for i in **/*.eml(.)
changer_date $i

Il me semble que bash a copié le **, et le (.) est moins indispensable.
Avatar
Benoit Izac
Bonjour,

le 08/05/2013 à 14:25, Francois Lafont a écrit dans le message
<518a443a$0$3743$ :

Pour la solution qui utilise une date contenu dans l'en-tête,
l'utilisation d'un langage de plus haut niveau, possédant des fonctions
permettant de lire des date me semble indispensable.



Tu es sûr ? Je vais peut-être dire une bêtise mais sur ma Debian
Squeeze la valeur du champ "Date" dans le fichier .eml de Lionmarron
semble bien être acceptée par la commande :

~$ d=$(grep '^Date: ' fichier.eml | cut -d' ' -f'2-')
~$ touch -d "$d" titi
~$ ls --full-time titi
-rw-r--r-- 1 francois francois 0 2013-03-16 19:25:35.000000000 +0100 titi

Non ?



Non car si le mail contient un /^Date: / dans le corps du mail, ton
ordinateur peut exploser. ;-)

En général, je privilégie la portabilité (j'ai des machines qui n'ont
pas le touch de coreutils). Si je veux parser une date, j'utiliserai
plus volontiers Perl et Date::Manip (et en ne regardant que l'en-tête du
mail).

Maintenant que tu as répondu au problème numéro deux, il reste le
dernier : récupérer la date de réception du mail (l'émetteur peut avoir
mis un champ date bidon) ; je ramasse les copies à la fin de la
journée. ;-)

--
Benoit Izac
1 2 3 4