Linux - Commande donnant la date d'un fichier
B@|-|@N
Messages postés
386
Date d'inscription
Statut
Membre
Dernière intervention
-
erhge -
erhge -
Bonjour.
Je cherche une commande Linux qui me donnerait la date d'un fichier.
"ls -l" ne me convient pas vraiment. Trop de traitement à coté. Existe-t-il une autre commande ?
En fait je voudrais recuperer cette date et la mettre dans une variable.
Bahan
Close the world.||.txen eht nepO
Je cherche une commande Linux qui me donnerait la date d'un fichier.
"ls -l" ne me convient pas vraiment. Trop de traitement à coté. Existe-t-il une autre commande ?
En fait je voudrais recuperer cette date et la mettre dans une variable.
Bahan
Close the world.||.txen eht nepO
A voir également:
- Linux date création fichier
- Fichier bin - Guide
- Fichier .dat - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
15 réponses
Salut,
C'est vrai qu'avec un ls, y'a du traitement... mais c'est pas si compliqué :)
Ceci dit, la commande la plus appropriée pour obtenir ce genre de renseignement est la commande stat!
@++
...Mana mana
Tutudutu...
C'est vrai qu'avec un ls, y'a du traitement... mais c'est pas si compliqué :)
Ceci dit, la commande la plus appropriée pour obtenir ce genre de renseignement est la commande stat!
stat -c %x stat -c %y stat -c %zCf: stat --help|more pour les options possibles et leur signification :)
@++
...Mana mana
Tutudutu...
Merci les gars mais le pb c que "ls" donne une date sous ce format : "sep 15 13:06"
Or je prefererais avoir une date sous le format jj/mm/aaaa h:m ou l'inverse.
Est-ce possible facilement ?
Sinon je fais ça, mais j'aurais aimé savoir si on pouvait avoir une date au format classique par une seule commande voire 2 ^_^
Bahan
Close the world.||.txen eht nepO
Or je prefererais avoir une date sous le format jj/mm/aaaa h:m ou l'inverse.
Est-ce possible facilement ?
Sinon je fais ça, mais j'aurais aimé savoir si on pouvait avoir une date au format classique par une seule commande voire 2 ^_^
Bahan
Close the world.||.txen eht nepO
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut à vous,
Bien aimé votre discussion.
ça m'a permis de revoir le sed, awk et shell !!
j'y suis presque arrivé :
# stat -c %x mon_fichier | awk -F: '{print $1}'
me donne :
2004-09-15 19
pas mal non ????
mais pas encore parfait !!!!
Merci encore à vous.
Hafed
Bien aimé votre discussion.
ça m'a permis de revoir le sed, awk et shell !!
j'y suis presque arrivé :
# stat -c %x mon_fichier | awk -F: '{print $1}'
me donne :
2004-09-15 19
pas mal non ????
mais pas encore parfait !!!!
Merci encore à vous.
Hafed
Bonjour,
Un chaînage de commandes devrait faire l'affaire :
ls -al nomdufichier | awk '{ print $6 $7 " " $8 }'
man awk
http://tille.soti.org/training/bash/ch06s02.html
Dal
Un chaînage de commandes devrait faire l'affaire :
ls -al nomdufichier | awk '{ print $6 $7 " " $8 }'
man awk
http://tille.soti.org/training/bash/ch06s02.html
Dal
Francois j'ai pas compris ton post ^_^
ll ne me dit vraiment rien comme commande.
Bon je m'en vais essayer le stat...
Bah ca m'a pas l'air mal. Faut juste que j'arrive a choper la date maintenant ^_^.
Et hop voila la ligne de commande : stat -c %y monFichier.
Puis je m'amuse avec les separateurs "-" et ":" et "."
Donc merci encore les ccmers!
Bahan
Close the world.||.txen eht nepO
ll ne me dit vraiment rien comme commande.
Bon je m'en vais essayer le stat...
Bah ca m'a pas l'air mal. Faut juste que j'arrive a choper la date maintenant ^_^.
Et hop voila la ligne de commande : stat -c %y monFichier.
Puis je m'amuse avec les separateurs "-" et ":" et "."
Donc merci encore les ccmers!
Bahan
Close the world.||.txen eht nepO
Rapidos,
sur une Debian Sarge
stat
exemple
johand@horus:~$ stat -c '%z' bidon
2004-09-11 05:04:21.000000000 +0200
Regarde les options : man stat
(voir l'appel système 'man 2 stat')
Sous Debian , on fait travailler les neurones et les doigts(enfin , le clavier. Ceci n'exclut pas les personnes handicapées de la vue ou d'autres ...
<troll>
Sympa, non
Il est un fait qu'on ne voit jamais d'utilisateur Debian sur CCM.
</troll>
johand@horus:~$ dpkg -S $(which stat)
coreutils: /usr/bin/stat
Donc, fourni d'office (coreutils,: ou alors l'utilisateur Debian est virtuel)
Pour rappel $(command params)
est une version bash lisible de 'backquote command params backquote '(je ne le le retrouve pas sur mon clavier ;)
(voir man dpkg)
Ici, on voit le plaisir d'utiliser Debian.
Je ne sais pas si cette commande utilisateur est fournie sur d'autres distributions.
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
sur une Debian Sarge
stat
exemple
johand@horus:~$ stat -c '%z' bidon
2004-09-11 05:04:21.000000000 +0200
Regarde les options : man stat
(voir l'appel système 'man 2 stat')
Sous Debian , on fait travailler les neurones et les doigts(enfin , le clavier. Ceci n'exclut pas les personnes handicapées de la vue ou d'autres ...
<troll>
Sympa, non
Il est un fait qu'on ne voit jamais d'utilisateur Debian sur CCM.
</troll>
johand@horus:~$ dpkg -S $(which stat)
coreutils: /usr/bin/stat
Donc, fourni d'office (coreutils,: ou alors l'utilisateur Debian est virtuel)
Pour rappel $(command params)
est une version bash lisible de 'backquote command params backquote '(je ne le le retrouve pas sur mon clavier ;)
(voir man dpkg)
Ici, on voit le plaisir d'utiliser Debian.
Je ne sais pas si cette commande utilisateur est fournie sur d'autres distributions.
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
<troll killer>
Je dirai simplement le plaisir d'utiliser linux.
</troll killer> :o)
Pour revenir à nos moutons:
vous allez sans doute trouver que j'ai un esprit tordu, mais j'aime tellement la ligne de commande que j'ai pas pu m'empecher de combinner les commandes pour avoir quelque chose de satisfaisant.
Donc l'idée aprés:
Dans la commande date, on peut envoyer une date a afficher avec l'option --date=CHAINE.
donc
Voilà, on peut envoyer ça a date:
@++
...Mana mana
Tutudutu...
Je dirai simplement le plaisir d'utiliser linux.
rpm -qf $(which stat)Sur n'importe quelle distribution qui utilise les rpm.
</troll killer> :o)
Pour revenir à nos moutons:
vous allez sans doute trouver que j'ai un esprit tordu, mais j'aime tellement la ligne de commande que j'ai pas pu m'empecher de combinner les commandes pour avoir quelque chose de satisfaisant.
Donc l'idée aprés:
stat fichier -c %xc'était de balancer ça à la commande date pour pouvoir le manipuler comme on veut :)
Dans la commande date, on peut envoyer une date a afficher avec l'option --date=CHAINE.
donc
date --date="$(stat test -c %x)"bonche, un probleme de format de date, si on teste, on voit que ce sont les milliseconde qui posent probleme :-/ suffit de les supprimer :)
stat fichier -c %x| sed "s/\.[0-9]\{9\}//"(supression de tout ce qui est de la forme .nnnnnnnnn un point suivi de neuf chiffres de 0 à 9)
Voilà, on peut envoyer ça a date:
date --date="$(stat test -c %x| sed "s/\.[0-9]\{9\}//")"Aprés quoi, les options de format de date permettent de l'afficher comme bon nous semble :)
@++
...Mana mana
Tutudutu...
/tmp/>ls -l test.FP.log | awk '{print $7" "$6" "$8}' 12 Jan 1999
rien de plus simple pour extraire la date...
C'est un peu plus compliqué si tu veux un format déterminé en sortie.
En effet, si ton fichier est récent tu n'auras pas l'année mais l'heure à la place.
Comme indiqué par asevere, la commande date permet de convertir n'importe quel format de représentation de date dans le format de ton choix (un peu comme strftime en C) et peut traiter la sortir de la commande awk.
Cependant la première solution qu'il a indiquée (stat) est plus directe que awk, à condition de disposer de la commande stat (ou de l'installer) et me semble préférable.
Dal
En effet, si ton fichier est récent tu n'auras pas l'année mais l'heure à la place.
Comme indiqué par asevere, la commande date permet de convertir n'importe quel format de représentation de date dans le format de ton choix (un peu comme strftime en C) et peut traiter la sortir de la commande awk.
Cependant la première solution qu'il a indiquée (stat) est plus directe que awk, à condition de disposer de la commande stat (ou de l'installer) et me semble préférable.
Dal
Rappelons nous la devise des unices
KISS
Keep It Simple, Stupid
http://www.faqs.org/docs/artu/ch01s07.html
http://www.faqs.org/docs/artu/ch01s08.html
Have all fun .
Johan
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
KISS
Keep It Simple, Stupid
http://www.faqs.org/docs/artu/ch01s07.html
http://www.faqs.org/docs/artu/ch01s08.html
Have all fun .
Johan
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
justement si le fichier à moins de 24h il est forcement de l'année courrante !
il suffit de rajouter un if dans la commande AWK ! pour que l'affichage soit bon et il est de plus reformatable dans le awk....
il suffit de rajouter un if dans la commande AWK ! pour que l'affichage soit bon et il est de plus reformatable dans le awk....
Pour ma culture, je suis preneur de ton exemple de syntaxe awk incorporant un test conditionnel du type que tu mentionnes (proposes tu de faire un contrôle sur l'existence de ":" par exemple ?).
Awk est un outil impressionant que j'aimerai mieux maîtriser.
Dal
Awk est un outil impressionant que j'aimerai mieux maîtriser.
Dal
Ben c'est pas les solutions qui manque :)
Je me suis amusé un peu, je n'en trouve aucune des deux vraiment esthetique, mais bon.
Solution 1:
Solution 2:
Ceci dit, pour que l'expression reguliere soit propre, on est obligé de spécifier l'option --posix ou --re-interval.
Du fait de awk, chaque print est séparé par un séparateur de champ initialisé a \n (newline), ce qui nous oblige à écraser la variable ORS (Output Record separator) pour separer les print par un espace sans ça, la mise en forme bat de l'aile.
Ceci nous force a rajouter un retour chariot a la fin de chaque ligne traitée ({ print "\n" }) d'ailleur, en tout logique, la variable ORS devrait etre remise à "\n" puis à espace puis à "\n" puis etc.
Je rajoute que dans les deux cas, il faut traiter la sortie du ls avant de la passer par awk (ou au debut de celui-ci) pour ne pas tenir compte de la ligne total qui peut apparaitre.
Il faut retoucher le script chaque année (et oui, dans moins de 4 mois, ça sera 2005 et non 2004) ou utiliser la commande date au depart pour fixer cette année dans une variable.
Voilà, y'a surment bien d'autres solutions avec awk, sans doute des plus élégantes, mais je doute qu'il puisse y en avoir une suffisament legere pour ce traitement là ;)
awk est exessivement puissant, mais il faut quand même l'utiliser a bon escient. Là en l'occurence, la commande stat est faite pour ça, a tel point que je me demande si stat n'est pas appellée lors d'un bete ls :o)
@++
...Mana mana
Tutudutu...
Je me suis amusé un peu, je n'en trouve aucune des deux vraiment esthetique, mais bon.
Solution 1:
ls -l | awk '{ if($8~/[0-9][0-9]:[0-9][0-9]/) {print $7" "$6" 2004"} \ else {print $7" "$6" "$8} }'Si une chaine du type [0-9][0-9]:[0-9][0-9] (deux chiffres, deux points, deux chiffre) apparait dans le champ 8, etc.c'est trés lourd, on fait un test qui affiche soit une chaine soit une autre. sans compter que l'expression réguliere est vraiment pas au top.
Solution 2:
ls -l | awk --re-interval 'BEGIN{ORS=" "} { print $7" "$6} \ { if($8~/[[:digit:]]{2}:[[:digit:]]{2}/) {print 2004} else {print $8} } \ { print "\n" }'Cette derniere parait plus logique puisque dans tout es cas, on affiche les deux champ interressants, et ensuite on vois s'il on affiche le champ 8, ou la date directement.
Ceci dit, pour que l'expression reguliere soit propre, on est obligé de spécifier l'option --posix ou --re-interval.
Du fait de awk, chaque print est séparé par un séparateur de champ initialisé a \n (newline), ce qui nous oblige à écraser la variable ORS (Output Record separator) pour separer les print par un espace sans ça, la mise en forme bat de l'aile.
Ceci nous force a rajouter un retour chariot a la fin de chaque ligne traitée ({ print "\n" }) d'ailleur, en tout logique, la variable ORS devrait etre remise à "\n" puis à espace puis à "\n" puis etc.
Je rajoute que dans les deux cas, il faut traiter la sortie du ls avant de la passer par awk (ou au debut de celui-ci) pour ne pas tenir compte de la ligne total qui peut apparaitre.
Il faut retoucher le script chaque année (et oui, dans moins de 4 mois, ça sera 2005 et non 2004) ou utiliser la commande date au depart pour fixer cette année dans une variable.
Voilà, y'a surment bien d'autres solutions avec awk, sans doute des plus élégantes, mais je doute qu'il puisse y en avoir une suffisament legere pour ce traitement là ;)
awk est exessivement puissant, mais il faut quand même l'utiliser a bon escient. Là en l'occurence, la commande stat est faite pour ça, a tel point que je me demande si stat n'est pas appellée lors d'un bete ls :o)
@++
...Mana mana
Tutudutu...
Pas présente partout.. c'est vite dit :)
ça fait partie du package coreutils, c'est dur de se debarasser de celui la sous linux :)
Quand à l'appel de stat, j'imagine bien que ls n'appel pas /bin/stat ceci dit, quand tu compares la structure de stat en C, et la sorti de stat... y'a ed quoi se poser des questions ;-)
...Mana mana
Tutudutu...
ça fait partie du package coreutils, c'est dur de se debarasser de celui la sous linux :)
Quand à l'appel de stat, j'imagine bien que ls n'appel pas /bin/stat ceci dit, quand tu compares la structure de stat en C, et la sorti de stat... y'a ed quoi se poser des questions ;-)
...Mana mana
Tutudutu...
Hello asevere,
Sur la question Linux, tu as peut être raison sur le fait que la commande stat se trouve sur toutes les distributions Linux (je n'ai vérifié toutes les distributions:).
Sur FreeBSD, la commande stat n'est présente que si tu l'installes avec les ports. Bien entendu, la commande ls existe et y est accessible. C'est ce qui me fait dire que la commande ls n'appelle pas la commande stat, mais la fonction stat de la librairie standard C.
Fais un test sur ton système linux. Renomme la commande stat et fait un ls -al.
Convaincu ?
Si la commande ls, qui doit souvent afficher des dizaines, ou des centaines de lignes relatives à des fichiers et qui est utilisée souvent pour peu que tu aimes la ligne de commande, devait à chaque ligne lancer un processus en utilisant la commande stat, celà serait un gaspillage inutile de mémoire et de temps machine.. tu ne crois pas ?
Le fait que la fonction C stat et la commande stat se ressemblent signifie simplement que la permière est utilisée pour l'implémentation de la deuxième, et n'a rien à voir avec la question de savoir si ls utilise l'un ou l'autre.
Enfin, pour trancher véritablement la question, il suffirait de se pencher sur le code source du programme "ls".
Dal
Sur la question Linux, tu as peut être raison sur le fait que la commande stat se trouve sur toutes les distributions Linux (je n'ai vérifié toutes les distributions:).
Sur FreeBSD, la commande stat n'est présente que si tu l'installes avec les ports. Bien entendu, la commande ls existe et y est accessible. C'est ce qui me fait dire que la commande ls n'appelle pas la commande stat, mais la fonction stat de la librairie standard C.
Fais un test sur ton système linux. Renomme la commande stat et fait un ls -al.
Convaincu ?
Si la commande ls, qui doit souvent afficher des dizaines, ou des centaines de lignes relatives à des fichiers et qui est utilisée souvent pour peu que tu aimes la ligne de commande, devait à chaque ligne lancer un processus en utilisant la commande stat, celà serait un gaspillage inutile de mémoire et de temps machine.. tu ne crois pas ?
Le fait que la fonction C stat et la commande stat se ressemblent signifie simplement que la permière est utilisée pour l'implémentation de la deuxième, et n'a rien à voir avec la question de savoir si ls utilise l'un ou l'autre.
Enfin, pour trancher véritablement la question, il suffirait de se pencher sur le code source du programme "ls".
Dal
$ touch toto
$ date -r toto '+%d/%m/%Y %H:%M:%S'
23/12/2010 00:34:34
(cf. man date pour les significations %d%m etc...)