Info statistiques sur un fichier Unix

karlus79 Messages postés 5 Statut Membre -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Voici mon problème : je souhaite connaitre une fonction unix pour afficher les statistiques d'un fichier sous Unix (SunOS). J'entends par là connaître sa date de dernière modification. Je connais la fonction "stat" en C (include stat.h) mais je veux utiliser un shell seul. Je connais aussi la fonction shell "ls -al" mais cela ne me convient pas non plus car le format d'affichage renvoyé n'est pas satisfaisant (Month Day hh:mi ou Month Day Year).
Donc existe-t-il une façon de faire en shell pour connaître la date de modification au format complet YYYYMMDD hhmiss ?
Merci

12 réponses

  1. jisisv Messages postés 3678 Statut Modérateur 936
     
    Je ne sais pas quelle est ta distribution. Debian contient l'outil ... stat
    qui fait vraissemblement appel à stat(2)
    johand@horus:~$ touch brol
    johand@horus:~$ lastmod=$(stat -c '%y' brol |cut -b -19)
    johand@horus:~$ echo $lastmod
    2006-02-16 00:31:12
    

    doit faire ton bonheur.
    johand@horus:~$ dpkg -S $(which stat)
    coreutils: /usr/bin/stat
    

    --> package coreutils , donc pas de soucis avec Debian

    En faisant une rapide recherche , je vois qu'il existe un paquage coreutils pour Suze.
    Si tu utilises une distribution basée sur rpm, , stat est peut-être déjà disponible, ou un paquage 'coreutils' est sans doute disponible.
    Johan
    0
  2. karlus79 Messages postés 5 Statut Membre
     
    Merci pour ton intervention, mais ça ne marche toujours pas :
    ksh: stat: not found
    La fonction "stat" n'est pas reconnue : ce n'est pas un commande shell...
    0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Pourquoi ne te contentes tu pas simplement de reformater dans ton script la sortie de ls -l avec des cut ou des awk ?

    Bonne chance
    0
  4. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    ... et transformer le format de date proposé dans le format qui te convient avec la commande "date".

    Dal
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. karlus79 Messages postés 5 Statut Membre
     
    J'ai essayé avec ls -l
    Voici le résultat :
    -rw-r--r-- 1 ksab sco 9 Dec 15 2004 fic.txt
    -rw-r--r-- 1 ksab sco 0 Aug 19 2005 t1.txt
    -rw-r--r-- 1 ksab sco 326 Feb 14 17:34 test.c

    Les vieux fichiers ont un format date = mois jour annee
    alors que les fichiers récents ont un format mois jour heure:minute
    Ce n'est pas très homogène !! On a 2 formats de date selon que le fichier est récent ou ancien !!
    N'ayant pas le package coreutils sur la machine Sun, je ne peux pas utiliser la fonction stat...
    0
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Et si tu faisais ce que moi et [Dal] te proposons ?
    0
  8. karlus79 Messages postés 5 Statut Membre
     
    Merci pour votre aide mamiemando et Dal.
    L'utilisation de ls -l était bien ma 1ere idée mais comme je l'ai dit, ça ne marche pas à tous les coups. Je détaille mon explication :

    1er ls sur un VIEUX fichier : ls -l fic.txt
    -rw-r--r-- 1 ksab sco 9 Dec 15 2004 fic.txt

    2eme ls sur un fichier RECENT : ls -l test.c
    -rw-r--r-- 1 ksab sco 326 Feb 14 17:34 test.c

    Comme on peut le voir, le 1er ls me donne un format de date différent du 2eme ls...

    L'utilisation de ls -l ne me garantit pas un affichage de la date avec un format parfaitement identifiable puisque un coup j'ai un format <Month> <Day> <Year>, un coup j'ai un format <Month> <Day> <Heure>:<Minute>
    Moi, j'aimerais bien connaitre une façon de faire pour qu'au final, j'ai toujours un format complet du style <Year> <Month> <Day> <Heure> <Minute>
    0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Essaie avec :
    ls --full-time
    "man ls" ... y'a tout ce qu'il faut dedans ;-))
    0
  10. karlus79 Messages postés 5 Statut Membre
     
    L'option--full-time n'est pas dispo dans mon OS (SunOS 5.8).
    Je ne dispose pas des packages fileutils ou coreutils qui autorisent cette option --full-time !

    Voici la seule syntaxe possible avec mon ls :
    SYNOPSIS
    /usr/bin/ls [ -aAbcCdfFgilLmnopqrRstux1 ] [ file ... ]

    /usr/xpg4/bin/ls [ -aAbcCdfFgilLmnopqrRstux1 ] [ file ... ]

    donc pas d'option --full-time : dommage !

    Bon, je crois sincèrement qu'il n'y a pas de solution shell sans utiliser les packages mentionnés ci-dessus, ni sans passer par un développement en C (utilisation de la fonction stat).

    Je crois que c'est la conclusion... Je baisse les bras !
    Merci à tous pour votre participation et votre aide.
    0
  11. juta
     
    Salut,

    Y'en a pas pour long à installer coreutils mais bon...
    Avec find, ça peut passer peut-etre (C'est pas plus une commande de ksh, mais j'ose espéré qu'elle est installée)
    find . -name ton_fichier -printf %t\\n
    0
  12. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Sinon tu peux faire un script python ou perl, qui sera portable en plus, et qui parse le résultat de ls -l à l'aide d'une regexp par format de date. Mais bon ça force à avoir installé python ou perl donc au final tu as sans doute meilleur temps d'installer les core-utils...
    0
  13. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Avec un script, awk, un test et date, on peut s'en sortir.

    Voilà un exemple en bash, traitant une ligne issue de "ls -al" passée en argument :

    $ cat testdate.sh
    #!/usr/local/bin/bash
    
    ST="$1"
    
    FICHIER=`echo $ST | awk '{ print $9 }'`
    LADATE=`echo $ST | awk '{ print $6 " " $7 " " $8 }'`
    
    if [ "$LADATE" != "  " ]
    then
      echo -n "date de $FICHIER : "
      if [ "`echo $LADATE | sed 's/\(.*\)\(:\)\(.*\)//'`" = "" ]
      then
        date -j -f "%b %d %R" "$LADATE" +"%F %T"
      else
        date -j -f "%b %d %Y" "$LADATE" +"%F"
      fi
    else
      echo "$ST ne semble pas comporter de date"
    fi
    
    $ ls -al | sed 's/^\(.*\)$/\"\1\"/' | xargs -L 1 ./testdate.sh


    La commande ci-dessus passe les lignes renvoyées par "ls -al" en argument entre guillements au script, et interprète les dates dans le format voulu dans tous les fichiers du répertoire courant. Celà fonctionne sur ma machine FreeBSD.

    Dal
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      La version "date" de Linux a des commandes légèrement différentes, et les tests sur la date peuvent être écrits sans avoir à décrire le format en entrée, respectivement comme ceci, selon que l'heure soit disponible ou pas :

      date -d "$LADATE" +"%F %T"
      date -d "$LADATE" +"%F"

      Remplacer également la première ligne par "#!/bin/bash", emplacement habituel de bash sous Linux.


      Dal
      0