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?
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);
Verwenden Sie die eingebaute stat Funktion. Oder genauer:
my $modtime = (stat($fh))[9]
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.
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.
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.
Sie können stat () oder das Modul File :: Stat verwenden.
perldoc -f stat
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];
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";
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.