Comment puis-je obtenir la dernière modification d'un fichier en Perl?

Supposons que j'ai un filehandle $fh. Je peux vérifier son existence avec -e $fh, ou la taille du fichier avec -s $fh ou un tas d'informations supplémentaires sur le fichier. Comment puis-je obtenir son dernier horodatage modifié?

58
demandé sur cowgod 2009-02-04 03:16:03

9 réponses

Vous pouvez utiliser le module intégré File::stat (inclus à partir de Perl 5.004).

L'appel à stat($fh) renvoie un tableau contenant les informations suivantes sur le handle de fichier transmis (à partir de la page de manuel perlfunc pour stat):

  0 dev      device number of filesystem
  1 ino      inode number
  2 mode     file mode  (type and permissions)
  3 nlink    number of (hard) links to the file
  4 uid      numeric user ID of file's owner
  5 gid      numeric group ID of file's owner
  6 rdev     the device identifier (special files only)
  7 size     total size of file, in bytes
  8 atime    last access time since the epoch
  9 mtime    last modify time since the epoch
 10 ctime    inode change time (NOT creation time!) since the epoch
 11 blksize  preferred block size for file system I/O
 12 blocks   actual number of blocks allocated

Le 9ème élément de ce tableau vous donnera la dernière heure modifiée depuis l'époque ( 00: 00 Janvier 1, 1970 GMT). À partir de là, vous pouvez déterminer l'heure locale:

my $epoch_timestamp = (stat($fh))[9];
my $timestamp       = localtime($epoch_timestamp);

Pour éviter les nombre magique 9 nécessaire dans le précédent exemple, utilisez en outre Time::localtime, un autre module intégré (également inclus dans Perl 5.004). Cela nécessite un code (sans doute) plus lisible:

use File::stat;
use Time::localtime;
my $timestamp = ctime(stat($fh)->mtime);
92
répondu cowgod 2009-02-04 00:50:27

Utilisez la fonction intégrée stat . Ou plus précisément:

my $modtime = (stat($fh))[9]
22
répondu Michael Carman 2009-02-04 00:24:51
my @array = stat($filehandle);

L'Heure de modification est stockée au format Unix dans $ array [9].

Ou explicitement:

my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
    $atime, $mtime, $ctime, $blksize, $blocks) = stat($filepath);

  0 dev      Device number of filesystem
  1 ino      inode number
  2 mode     File mode  (type and permissions)
  3 nlink    Number of (hard) links to the file
  4 uid      Numeric user ID of file's owner
  5 gid      Numeric group ID of file's owner
  6 rdev     The device identifier (special files only)
  7 size     Total size of file, in bytes
  8 atime    Last access time in seconds since the epoch
  9 mtime    Last modify time in seconds since the epoch
 10 ctime    inode change time in seconds since the epoch
 11 blksize  Preferred block size for file system I/O
 12 blocks   Actual number of blocks allocated

L'époque était à 00:00 Janvier 1, 1970 GMT.

Plus d'informations dans stat.

18
répondu David S. 2015-10-20 14:17:23

Vous avez besoin de l'appel stat et du nom du fichier:

my $last_mod_time = (stat ($file))[9];

Perl a également une version différente:

my $last_mod_time = -M $file;

Mais cette valeur est relative au démarrage du programme. Ceci est utile pour des choses comme le tri, mais vous voulez probablement la première version.

12
répondu Paul Beckingham 2009-02-04 00:25:27

Si vous comparez simplement deux fichiers pour voir lequel est le plus récent, alors -C devrait fonctionner:

if (-C "file1.txt" > -C "file2.txt") {
{
    /* Update */
}

Il y a aussi -M, mais je ne pense pas que ce soit ce que vous voulez. Heureusement, il est presque impossible de rechercher de la documentation sur ces opérateurs de fichiers via Google.

8
répondu Peter Mortensen 2015-10-30 17:35:07

Vous pouvez utiliser stat () ou le module File:: Stat.

perldoc -f stat
3
répondu Chris Kloberdanz 2009-02-04 00:25:05

Je pense que vous cherchez la fonction stat (perldoc-F stat)

En particulier, le 9ème champ (10ème, index #9) de la liste renvoyée est le dernier temps de modification du fichier en secondes depuis l'époque.

Donc:

Mon $LAST_MODIFIED = (stat ($fh)) [9];

3
répondu Lee 2009-02-04 00:26:17

Sur mon système FreeBSD , stat renvoie juste une bénédiction.

$VAR1 = bless( [
                 102,
                 8,
                 33188,
                 1,
                 0,
                 0,
                 661,
                 276,
                 1372816636,
                 1372755222,
                 1372755233,
                 32768,
                 8
               ], 'File::stat' );

Vous devez extraire mtime comme ceci:

my @ABC = (stat($my_file));

print "-----------$ABC['File::stat'][9] ------------------------\n";

Ou

print "-----------$ABC[0][9] ------------------------\n";
2
répondu holly 2015-10-30 17:37:49

C'est un très vieux thread, mais j'ai essayé d'utiliser la solution et je n'ai pas pu extraire les informations de File::stat. (Perl 5.10.1)

Je devais faire ce qui suit:

my $f_stats = stat($fh);
my $timestamp_mod = localtime($f_stats->mtime);
print "MOD_TIME = $timestamp_mod \n";

Je pensais juste partager au cas où quelqu'un d'autre aurait le même problème.

0
répondu MBW 2018-03-10 18:44:45