Heure de modification du fichier (secondes) sous Unix

Sur Unix, existe-t-il une commande pour afficher l’heure de modification d’un fichier, précise à la seconde?

Sous Linux, cela se fait facilement avec “stat -c% y”, qui renvoie quelque chose comme 2009-11-27 11:36:06.000000000 +0100 . Je n’ai trouvé aucun équivalent sur Unix.

J’ai trouvé ça:

 ls --time-style='+%d-%m-%Y %H:%M:%S' -l 

Qui exporte quelque chose comme ça:

 root:~# ls --time-style='+%d-%m-%Y %H:%M:%S' -l total 0 -rw-r--r-- 1 root root 0 16-04-2015 23:14:02 other-file.txt -rw-r--r-- 1 root root 0 16-04-2015 23:13:58 test.txt 

Selon la page de manuel de mon Mac (qui a la version standard de BSD), vous pouvez obtenir la version de l’époque de la modification en quelques secondes avec:

 stat -f %m /etc/passwd 

Ou si vous voulez l’imprimer en heures: minutes: secondes, vous pouvez le faire:

 perl -e "print scalar(localtime(`stat -f %m /etc/passwd`))" 

Ce qui suit vous donne la dernière heure de modification en secondes depuis Epoch:

 stat -c%Y  

La commande find est une bonne source d’informations sur tous les types de fichiers, y compris l’heure de modification du second:

 find /etc/passwd -maxdepth 0 -printf "%TY/%Tm/%Td %TH:%TM:%.2TS\n" 2011/11/21 13:41:36 

Le premier argument peut être un fichier. Le maxdepth empêche la recherche si un nom de répertoire est donné. Le% T lui demande d’imprimer l’heure de dernière modification.

Certains systèmes interprètent% TS comme un nombre à virgule flottante secondes (par exemple, 36.8342610). Si vous voulez des fractions de secondes, utilisez “% TS” au lieu de “% .2TS”, mais vous ne verrez peut-être pas de fractions de secondes sur chaque système.

Pour toute personne confrontée au même problème, je n’ai trouvé aucune solution (sur HP-UX 11i de toute façon). J’ai fini par coder un “ls -lh” personnalisé pour mes besoins. Ce n’est pas si difficile.

  - 664 rw-/rw-/r-- 1L expertNoob adm 8.37 kB 2010.08.24 12:11:15 findf1.c d 775 rwx/rwx/rx 2L expertNoob adm 96 B 2010.08.24 15:17:37 tmp/ - 775 rwx/rwx/rx 1L expertNoob adm 16 kB 2010.08.24 12:35:30 findf1 - 775 rwx/rwx/rx 1L expertNoob adm 24 kB 2010.09.14 19:45:20 dir_info - 444 r--/r--/r-- 1L expertNoob adm 9.01 kB 2010.09.01 11:23:41 getopt.c - 664 rw-/rw-/r-- 1L expertNoob adm 6.86 kB 2010.09.01 11:24:47 getopt.o - 664 rw-/rw-/r-- 1L expertNoob adm 6.93 kB 2010.09.14 19:37:44 findf1.o l 775 rwx/rwx/rx 1L expertNoob adm 6 B 2010.10.06 17:09:01 test1 -> test.c - 664 rw-/rw-/r-- 1L expertNoob adm 534 B 2009.03.26 15:34:23 > test.c d 755 rwx/rx/rx 25L expertNoob adm 8 kB 2009.05.20 15:36:23 zip30/ 

C’est ici :

 #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  //#include  #include  // PATH_MAX #include  #include "getopt.h" static short START_VSNBUFF=16; // This is bformat from Better Ssortingng library (bstrlib), customized int strformat (char ** str, const char * fmt, ...) { va_list arglist; char * buff; int n, r; /* Since the length is not determinable beforehand, a search is performed using the truncating "vsnprintf" call (to avoid buffer overflows) on increasing potential sizes for the output result. */ if ((n = (int) (2*strlen (fmt))) < START_VSNBUFF) n = START_VSNBUFF; if ( NULL == ( buff = (char *) malloc((n + 2)*sizeof(char)) ) ) { n = 1; if ( NULL == ( buff = (char *) malloc((n + 2)*sizeof(char)) ) ) { fprintf( stderr, "strformat: not enough memory to format string\n" ); return -1; } } for (;;) { va_start (arglist, fmt); r = vsnprintf (buff, n + 1, fmt, arglist); // n+1 chars: buff[0]..buff[n], n chars from arglist: buff[n]='\0' va_end (arglist); buff[n] = (unsigned char) '\0'; // doesn't hurt, especially strlen! if ( strlen(buff) < n ) break; if (r > n) n = r; else n += n; if ( NULL == ( buff = (char *) realloc( buff, (n + 2)*sizeof(char) ) ) ) { free(buff); fprintf( stderr, "strformat: not enough memory to format ssortingng\n" ); return -1; } } if( NULL != *str ) free(*str); *str = buff; return 0; } int printFSObjectInfo( const char * path, const char * name ) { struct stat statbuf; struct passwd *pwd; struct group *grp; struct tm *tm; char datessortingng[256]; char *type = "? "; char *fbuf = NULL; double size = 0; const char *units[] = {"B ", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}; int i = 0; char owner[] = "---", group[] = "---", others[] = "---"; /* Get entry's information. */ if ( -1 == lstat( path, &statbuf ) ) { fprintf( stderr, "printFSObjectInfo: error: can't stat %s\n", path ); if( 0 == strformat( &fbuf, "lstat() said: %s", path ) ) { perror(fbuf); return -1; } } // File type if( S_ISREG(statbuf.st_mode) ) type = "-"; // regular file if( S_ISDIR(statbuf.st_mode) ) { // directory type="d"; if( S_ISCDF(statbuf.st_mode) ) type = "hd"; // hidden dir } if( S_ISBLK(statbuf.st_mode) ) type = "b"; // block special if( S_ISCHR(statbuf.st_mode) ) type = "c"; // character special if( S_ISFIFO(statbuf.st_mode) ) type = "f"; // pipe or FIFO if( S_ISLNK(statbuf.st_mode) ) type = "l"; // symbolic link if( S_ISSOCK(statbuf.st_mode) ) type = "s"; // socket if( S_ISNWK(statbuf.st_mode) ) type = "n"; // network special printf( "%2s ", type ); /* Print out type, permissions, and number of links. */ //printf("%10.10s", sperm (statbuf.st_mode)); if( S_IRUSR & statbuf.st_mode ) owner[0] = 'r'; if( S_IWUSR & statbuf.st_mode ) owner[1] = 'w'; if( S_IXUSR & statbuf.st_mode ) owner[2] = 'x'; if( S_IRGRP & statbuf.st_mode ) group[0] = 'r'; if( S_IWGRP & statbuf.st_mode ) group[1] = 'w'; if( S_IXGRP & statbuf.st_mode ) group[2] = 'x'; if( S_IROTH & statbuf.st_mode ) others[0] = 'r'; if( S_IWOTH & statbuf.st_mode ) others[1] = 'w'; if( S_IXOTH & statbuf.st_mode ) others[2] = 'x'; //printf( "\n%o\n", statbuf.st_mode ); printf( "%3o %s/%s/%s ", 0777 & statbuf.st_mode, owner, group, others ); printf("%4dL", statbuf.st_nlink); /* Print out owner's name if it is found using getpwuid(). */ if ((pwd = getpwuid(statbuf.st_uid)) != NULL) printf(" %-8.8s", pwd->pw_name); else printf(" %-8d", statbuf.st_uid); /* Print out group name if it is found using getgrgid(). */ if ((grp = getgrgid(statbuf.st_gid)) != NULL) printf(" %-8.8s", grp->gr_name); else printf(" %-8d", statbuf.st_gid); /* Print size of file. */ //printf(" %9d", (int)statbuf.st_size); i = 0; size = (double) statbuf.st_size; while (size >= 1024) { size /= 1024; i++; } if( 0 == (double)(size - (long) size) ) printf( "%7d %-2s", (long)size, units[i] ); else printf( "%7.2f %-2s", size, units[i] ); tm = localtime(&statbuf.st_mtime); /* Get localized date ssortingng. */ strftime(datessortingng, sizeof(datessortingng), "%Y.%m.%d %T", tm); // nl_langinfo(D_T_FMT) if ( 0 == strcmp(name, "\n") ) printf(" %s > %s", datessortingng, path); else { if( 0 == strcmp(type, "d") ) printf(" %s %s/", datessortingng, name); else printf(" %s %s", datessortingng, name); } if( 0 == strcmp(type, "l") ) { char buf[1+PATH_MAX]; if( -1 == readlink( path, buf, (1+PATH_MAX) ) ) { fprintf( stderr, "printFSObjectInfo: error: can't read symbolic link %s\n", path); if( 0 == strformat( &fbuf, "readlink() said: %s:", path ) ) { perror(fbuf); return -2; } } else { lstat( buf, &statbuf ); // want errno, a symlink may point to non-existing object if(errno == ENOENT) printf(" -> %s [!no such file!]\n", buf ); else { printf(" -> %s\n", buf ); if ( 0 != strcmp(name, "\n") ) printFSObjectInfo( buf, "\n" ); } } } else printf("\n"); return 0; } int main(int argc, char **argv) { struct dirent *dp; struct stat statbuf; char *path = NULL; //[1+PATH_MAX]; char *fbuf = NULL; char *pathArg = NULL; if( argc == 1 || 0 == strlen(argv[1]) ) pathArg = "."; else pathArg = argv[1]; if ( lstat( pathArg, &statbuf ) == -1 ) { printf("%s: error: can't stat %s\n", argv[0], pathArg); if( 0 == strformat( &fbuf, "stat() said: %s", pathArg ) ) perror(fbuf); exit(2); } if( S_ISDIR(statbuf.st_mode) ) { DIR *dir = opendir( pathArg ); if( NULL == dir ) { fprintf( stderr, "%s: error: can't open %s\n", argv[0], pathArg ); if( 0 != strformat( &fbuf, "opendir() said: %s", pathArg ) ) exit(5); perror(fbuf); exit(4); } /* Loop through directory ensortinges. */ while ( (dp = readdir(dir)) != NULL ) { if( 0!= strformat( &path, "%s/%s", pathArg, dp->d_name ) ) continue; printFSObjectInfo( path, dp->d_name ); } closedir(dir); } else printFSObjectInfo( pathArg, pathArg ); return 0; } 

Dans printFSObjectInfo (), vous disposez de toutes les fonctionnalités de l’appel système lstat (), vous pouvez personnaliser cela selon vos souhaits.

Être bien.

Sur Mac OS X (testé sur 10.10.5 Yosemite via 10.12.4 Sierra):

 prompt> ls -lT total 0 -rw-r--r-- 1 youruser staff 0 Sep 24 10:28:30 2015 my_file_1.txt -rw-r--r-- 1 youruser staff 0 Sep 24 10:28:35 2015 my_file_2.txt 

Si vous utilisez HP-UX:

Ok, disons que le nom du fichier est “indésirable”. Sur HP-UX, vous pouvez faire:

perl -e ‘@ d = localtime ((stat (shift)) [9]); printf “% 4d-% 02d-% 02d% 02d:% 02d:% 02d \ n”, $ d [5] + 1900, $ d [4] + 1, $ d [3], $ d [2], $ d [1], $ d [0] ‘indésirable

Et oui, perl est livré avec HP-UX. C’est dans / usr / consortingb. Mais vous pouvez avoir une version plus récente dans / usr / local ou / opt.

Source: Perderabo

Aujourd’hui, j’ai rencontré le même problème sur une ancienne version de HP-UX. Le programme de statistiques ne faisait pas partie de l’installation. (juste la version C)

La solution la plus rapide pour moi consistait à utiliser un outil tel que le transfert de fichiers Tectia sur mon ordinateur portable, sans effectuer de copie, il convertissait l’heure de dernière modification de HP-UX et fournissait les dates et heures de tous les fichiers. connecté à UNIX.

Peut-être que cela fonctionne avec d’autres outils de transfert de fichiers basés sur des graphiques similaires, mais je n’ai pas encore essayé.

Sur AIX, la commande istat fait ceci:

 machine:~/support> istat ../core Inode 30034 on device 32/3 File Protection: rw-rw-r-- Owner: 500(group) Group: 500(user) Link count: 1 Length 10787748 bytes Last updated: Wed Feb 22 13:54:28 2012 Last modified: Wed Feb 22 13:54:28 2012 Last accessed: Wed Feb 22 19:58:10 2012 

ls -le fonctionne si vous n’avez besoin que de HH: MM: SS

Secondes:

 date +%s -r /etc/passwd 

Ou, avec plus de précision (précision jusqu’à la nanoseconde), si votre système de fichiers le supporte:

 date +%s.%N -r /etc/passwd 

Essayez un perl one-liner:

 perl -e '@d=localtime ((stat(shift))[9]); printf "%02d-%02d-%04d %02d:%02d:%02d\n", $d[3],$d[4]+1,$d[5]+1900,$d[2],$d[1],$d[0]' your_file_to_show_the_date_for.your_extension