webentwicklung-frage-antwort-db.com.de

Wie erhalte ich die letzte Änderungszeit einer Datei in Perl?

Angenommen, ich habe ein Dateihandle $fh. Ich kann seine Existenz mit -e $fh Oder seine Dateigröße mit -s $fh Oder einer Reihe zusätzlicher Informationen über die Datei überprüfen . Wie kann ich den letzten geänderten Zeitstempel erhalten?

62
cowgod

Sie können das eingebaute Modul File::stat (Ab Perl 5.004 enthalten) verwenden.

Das Aufrufen von stat($fh) gibt ein Array mit den folgenden Informationen zum übergebenen Datei-Handle zurück (aus der Manpage perlfunc for 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

Element Nummer 9 in diesem Array gibt die letzte geänderte Zeit seit der Epoche an ( 00:00 1. Januar 1970 GMT). Daraus können Sie die Ortszeit ermitteln:

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

Um die magische Zahl 9 zu vermeiden, die im vorherigen Beispiel benötigt wurde, verwenden Sie zusätzlich Time::localtime, Ein weiteres eingebautes Modul (ebenfalls ab Perl enthalten) 5.004). Dies erfordert (wohl) besser lesbaren Code:

use File::stat;
use Time::localtime;
my $timestamp = ctime(stat($fh)->mtime);
96
cowgod

Verwenden Sie die eingebaute stat Funktion. Oder genauer:

my $modtime = (stat($fh))[9]
24
Michael Carman
my @array = stat($filehandle);

Die Änderungszeit wird im Unix-Format in $ array [9] gespeichert.

Oder ausdrücklich:

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

Die Epoche war am 1. Januar 1970 um 00:00 Uhr GMT.

Weitere Informationen finden Sie in stat.

18
David Segonds

Sie benötigen den stat-Aufruf und den Dateinamen:

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

Perl hat auch eine andere Version:

my $last_mod_time = -M $file;

dieser Wert ist jedoch relativ zu dem Zeitpunkt, zu dem das Programm gestartet wurde. Dies ist nützlich für Dinge wie Sortieren, aber Sie möchten wahrscheinlich die erste Version.

13
Paul Beckingham

Wenn Sie nur zwei Dateien vergleichen, um zu sehen, welche neuer sind, dann -C sollte arbeiten:

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

Es gibt auch -M, aber ich glaube nicht, dass es das ist, was du willst. Glücklicherweise ist es fast unmöglich, über Google nach Dokumentationen zu diesen Dateioperatoren zu suchen.

9
Dan Olson

Sie können stat () oder das Modul File :: Stat verwenden.

perldoc -f stat
3

Ich denke, Sie suchen nach der Funktion stat (perldoc -f stat)

Insbesondere ist das 9. Feld (10., Index Nr. 9) der zurückgegebenen Liste der letzte Änderungszeitpunkt der Datei in Sekunden seit der Epoche.

So:

my $last_modified = (stat($fh))[9];

3
Lee

Auf meinem FreeBSD System gibt stat nur einen Segen zurück.

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

Sie müssen mtime folgendermaßen extrahieren:

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

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

oder

print "-----------$ABC[0][9] ------------------------\n";
2
holly

Dies ist ein sehr alter Thread, aber ich habe versucht, die Lösung zu verwenden, und konnte die Informationen nicht aus File :: stat abrufen. (Perl 5.10.1)

Ich musste Folgendes tun:

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

Ich dachte nur, ich teile für den Fall, dass jemand das gleiche Problem hat.

1
MBW