2009-02-04 12 views

Respuesta

90

Puede usar el módulo integrado File::stat (incluido en Perl 5.004).

Calling stat($fh) devuelve una matriz con la siguiente información sobre el identificador de archivo aprobada en (desde el perlfunc man page 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 

El elemento noveno en esta matriz le dará la última vez modificado desde la época (00:00 1 de enero de 1970 GMT). Desde que se puede determinar la hora local:

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

Para evitar la número mágico 9 necesaria en el ejemplo anterior, además, utilizar Time::localtime, otro módulo integrado (también incluido como Perl de 5.004).Esto requiere un cierto código (posiblemente) más legible:

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

¿Se supone que 'localtime' corrige los cambios de zona horaria? Es decir: archivo creado en PST, luego lea 'mtime' desde CET. Estoy obteniendo resultados confusos. –

21

Utilice la función integrada stat. O más específicamente:

my $modtime = (stat($fh))[9] 
3

Puede usar stat() o el módulo File :: Stat.

perldoc -f stat 
12

Usted necesita la llamada stat, y el nombre del archivo:

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

Perl también tiene una versión diferente:

my $last_mod_time = -M $file; 

pero ese valor es relativo a cuando se inicia el programa. Esto es útil para cosas como la clasificación, pero es probable que desee la primera versión.

18
my @array = stat($filehandle); 

El tiempo de modificación se almacena en formato Unix en $ array [9].

o explícitamente:

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 

La época era a las 00:00 1 de enero de 1970, hora GMT.

Más información está en stat.

3

creo que usted está buscando para la función stat (stat perldoc f)

En particular, el campo noveno (10a, índice # 9) de la lista devuelta es la última hora de modificación del archivo en segundos desde la época.

Así:

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

8

Si acaba de comparar dos archivos para ver cuál es más reciente y luego -C debería funcionar:

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

También hay -M, pero yo don' Creo que es lo que quieres. Afortunadamente, es casi imposible buscar documentación sobre estos operadores de archivos a través de Google.

+2

Para google '-M', agregue las comillas" -M ", ya que' -X' elimina los resultados que tienen 'X' ... Por cierto, '-M' es lo que quiere el OP. –

+1

Sería más natural usar "<" (para probar si "archivo1.txt" es el más nuevo, ya que *** "- C" devuelve la antigüedad del archivo, no la fecha (de creación)) *** . –

+0

Explicación de la diferencia entre -M (modificación de contenido) y -C (cambio de inodo): https://unix.stackexchange.com/questions/132660/whats-the-difference-between-modification-date-and-inodes- fecha de modificación –

2

En mi sistema FreeBSD, stat simplemente devuelve un favor.

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

Hay que extraer mtime así:

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

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

o

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

Este es el hilo muy antiguo, pero trató de usar la solución y no se pudo obtener la información de Archivo :: stat. (Perl 5.10.1)

que tenía que hacer lo siguiente:

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

sólo pensé que compartir por si alguien más ha tenido el mismo problema.

Cuestiones relacionadas