Ich versuche, ein ziemlich großes Dateisystem aufzuräumen. Ich verwende die stat
Funktion, um die Änderungszeit jeder Datei zu erhalten.Fehler in der abgelaufenen Zeit seit der Änderung der Datei mit "DateTime"
Gemäß perldoc -f stat
ist das zehnte Element der zurückgegebenen Liste die letzte in Sekunden seit der Epoche geänderte Zeit.
Ich benutze DateTime->from_epoch
und subtrahieren DateTime->now
das Alter des fule
#!/usr/bin/perl
use strict;
use warnings;
use DateTime;
my $now = DateTime->now();
#my $now = DateTime->now(time_zone => "America/New_York");
$self->{dir} = '/tmp/test';
opendir(DIR, $self->{dir}) or die [email protected];
my @files = grep(/\.txt$/, readdir(DIR));
closedir(DIR);
for (@files) {
my $file = stat($self->{dir} . '/' . $_);
my $mtime = DateTime->from_epoch(epoch => $file->mtime);
#my $mtime = DateTime->from_epoch(epoch => $file->mtime, time_zone=> "America/New_York");
my $elapsed = $now - $mtime;
push(@{$self->{stale}}, {file => $self->{dir} . '/' . $_, mtime => $elapsed->in_units('minutes')}) if $elapsed->in_units('minutes') > 15;
push(@{$self->{remove}}, {file => $self->{dir} . '/' . $_, mtime => $elapsed->in_units('days')}) if $elapsed->in_units('days') > 10;
}
zu berechnen Wenn ich manuell Testdateien erstellen und die Änderung der Zeit ändern, ist das Ergebnis um 30 Tage
$ touch /tmp/test/test{100..104}.txt -d '-45 days'
$ perl MTIME.pm
$VAR1 = {
'mtime' => 15,
'file' => '/tmp/test/test100.txt'
}; $VAR1 = {
'mtime' => 15,
'file' => '/tmp/test/test104.txt'
}; $VAR1 = {
'mtime' => 15,
'file' => '/tmp/test/test103.txt'
}; $VAR1 = {
'mtime' => 15,
'file' => '/tmp/test/test101.txt'
}; $VAR1 = {
'mtime' => 15,
'file' => '/tmp/test/test102.txt'
};
off Ich habe versucht DateTime
Objekte mit und ohne die Zeitzone ohne Unterschied in den Ergebnissen festgelegt.
$ touch /tmp/test/test{100..104}.txt -d '-45 days'
$ touch /tmp/test/test{105..110}.txt
$ ll /tmp/test
total 11
-rw-r--r-- 1 root root 0 Apr 3 19:31 test100.txt
-rw-r--r-- 1 root root 0 Apr 3 19:31 test101.txt
-rw-r--r-- 1 root root 0 Apr 3 19:31 test102.txt
-rw-r--r-- 1 root root 0 Apr 3 19:31 test103.txt
-rw-r--r-- 1 root root 0 Apr 3 19:31 test104.txt
-rw-r--r-- 1 root root 0 May 18 19:30 test105.txt
-rw-r--r-- 1 root root 0 May 18 19:30 test106.txt
-rw-r--r-- 1 root root 0 May 18 19:30 test107.txt
-rw-r--r-- 1 root root 0 May 18 19:30 test108.txt
-rw-r--r-- 1 root root 0 May 18 19:30 test109.txt
-rw-r--r-- 1 root root 0 May 18 19:30 test110.txt
Arbeitslösung:
#!/usr/bin/perl
use strict;
use warnings 'all';
use Data::Dumper;
my $self = bless { }, 'My::Class';
my @files = glob '/tmp/test/*.txt';
for (@files) {
my $days = int(-M $_);
my $mins = int((time - (stat $_)[9])/60);
my $item = {
file => $_,
days => $days,
minutes => $mins
};
push @{ $self->{remove} }, $item if $days > 10;
push @{ $self->{stale} }, $item if $mins > 15;
}
print Dumper $self;
Haben Sie darüber nachgedacht '-M $ file'? Es ist der Unterschied zwischen der Startzeit des Skripts (so, "jetzt") und der Zeit der letzten Änderung, was scheint, was Sie brauchen. Siehe [Dateitests (-X)] (http://perldoc.perl.org/functions/-X.html). – zdim
Bitte überprüfen Sie, was Sie gepostet haben. Das '$ self -> {dir} ...' sollte nicht unter 'strict' kompiliert werden (und macht keinen Sinn wie es ist) – zdim
Sie werden feststellen, dass, um die volle Dauer zu erhalten, nur in_units ('Tage') aufgerufen wird nicht gut genug. Sehen Sie sich die DateTime :: Duration-Dokumente an, da Sie Monate oder sogar Jahre verpasst haben, ohne es zu merken. Arbeiten direkt mit Epochen Zahlen und Sekunden kann hier einfacher sein. – bytepusher