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).
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.
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).
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).
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).
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.
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 :
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.
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 :
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.
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 :
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.
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
Bonjour,
le 08/05/2013 à 09:55, lionmarron a écrit dans le message
<kmd0d2$mog$1@shakotay.alphanet.ch> :
Voilà par exemple ce que donne cat sur un fichier pas trop long :
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.
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
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 :
Si c'est GNU touch (des coreutils), oui, il arrive à parser à peu près n'importe quelle syntaxe pour la date.
Francois Lafont , dans le message
<518a443a$0$3743$426a74cc@news.free.fr>, 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 :
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 :
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.
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.
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.
Il me semble que bash a copié le **, et le (.) est moins indispensable.
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
Bonjour,
le 08/05/2013 à 14:25, Francois Lafont a écrit dans le message
<518a443a$0$3743$426a74cc@news.free.fr> :
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. ;-)
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. ;-)