- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
sub rotate {
my ($filename, $max_entries) = @_;
$max_entries //= 10; # TODO: make infinity available
return if (! -f $filename);
my ($name, $dir, $suffix) = fileparse($filename, qr/\.[^.]*$/);
my %old_files = ();
my $shift_max = 0; # maximum number of file that is going to be rotated
my $glob = File::Spec->catfile($dir, $name . '.*' . $suffix);
for my $file (glob qq/"$glob"/) {
my ($number) = $file =~ /\.(\d+)\Q$suffix\E$/;
$old_files{$number} = $file if (defined $number);
$shift_max++ while (exists $old_files{$shift_max + 1});
}
$shift_max = $max_entries - 1 if ($shift_max >= $max_entries);
# how many files to remove from the end
my $to_remove = scalar(keys %old_files) - $max_entries;
# rename and unlink
for my $number (sort { $b <=> $a } keys %old_files) {
my $file = $old_files{$number};
if ($to_remove-- > 0) {
print "## DEBUG: unlink $file\n";
unlink($file)
or croak('Cannot unlink ' . $file);
} elsif ($number <= $shift_max) {
my $new_name = File::Spec->catfile($dir, $name . '.' . ($number + 1) . $suffix);
print "## DEBUG: rename $file -> $new_name\n";
rename($file, $new_name)
or croak('Cannot rename ' . $file . ' to ' . $new_name);
}
}
my $new_name = File::Spec->catfile($dir, $name . '.1' . $suffix);
print "## DEBUG: rename $filename -> $new_name\n";
rename($filename, $new_name)
or croak('Cannot rename ' . $filename . ' to ' . $new_name);
}
Продолжаем парад велосипедов. Сделал ротацию бекап-архивов :-{
Elvenfighter 20.11.2014 18:29 # +27
guesto 23.08.2016 08:06 # +3
SlavaBagru 23.08.2016 08:41 # +3
bormand 20.11.2014 18:40 # +28
Анонимус 20.11.2014 18:43 # +27
bormand 20.11.2014 18:46 # +27
Если уж уходим от велосипедов - то к нормальной системе бекапов, а не к еще более костыльным решениям...
Анонимус 20.11.2014 18:48 # +27
bormand 20.11.2014 18:49 # +27
Ну у логротейта задача немного не та... Хотя... Если в prerotate делать сам бекап, а триггеры настраивать только по времени - должно проканать.
roman-kashitsyn 20.11.2014 22:57 # +30
Shamill 12.08.2016 16:08 # +2
raMagPuJI 04.10.2019 02:06 # 0
raMagPuJI 04.10.2019 02:14 # 0