8 août 2005

Obtenir l'horodatage exact d'un fichier Unix

Si sous Linux, le "ls" GNU possède l'option --full-time ...
ls --full-time $TMP/a.batch
-rw-r--r--  1 hradev hradev 932 2012-09-21 10:50:35.000000000 +0200 /hradev/txt/tmp/a.batch


... sous Unix je n'ai jamais pu trouver comment obtenir simplement la date précise de dernière modification d'un fichier ... Qui plus est avec un format d'affichage constant (et non le "mmm JJ HH:MM" qui devient un "mmm JJ YYYY" passés 6 mois) ... 

Suite à une astuce relative à la commande "tar" donnée par un collègue (merci Gabriel), j'ai rédigé cette petite fonction nommée timestamp (que vous pouvez placer dans votre fichier profile). Pour l'utiliser tapez :
timestamp dirname/filename

Exemple :

/home/moi/ ls -al .profile
-rwxr-----    1 moi staff           684 Mar 16 2011  .profile
/home/moi/ timestamp .profile
Mar 16 2011 14:42:44


Ci dessous la fonction en question :

function timestamp
{
# Displays file timestamp
# french : jj mmm yyyy hh:mm:ss / english :  mmm jj yyyy hh:mm:ss
#
#set -x # Uncomment to active trace mode

File=$1
if [ ! -e "${File}" ]
then
   echo "usage : ${0} { filename | dirname }" >&2
   return 1
else
   # Creating a dummy file whith same timestamp
   touch -r "${File}" /tmp/T.timestamp.$$
   if [ $? -ne 0 ]
   then
      echo "${0} : Could not create temporary file in /tmp" >&2
      return 1
   else
#     LANG=fr_FR # Uncomment to force french format
#     LANG=en_EN # Uncomment to force english format
      # Tar and untar this file to catch its timestamp, then print it
      tar -cf - /tmp/T.timestamp.$$ | tar -tvf - | awk '{print $5" "$6" "$8" "$7}'
      # Removing the dummy file
      rm -f /tmp/T.timestamp.$$
      return 0
   fi
fi
}