I had a problem ... when we rebuilt my Linux server a year ago, the hardware Real Time Clock (RTC) got set to the wrong decade, probably due to a order-of-date issue, maybe a typo. So each time it rebooted, it reset the year to 2025, but otherwise correct. I usually fixed it fairly quickly, but took me quite a while to figure out that the RTC was the problem and how to re-write the RTC from commandline.
I looked at Date::Calc
and DateTime
modules, but neither made it easy to subtract 20 years from a file timestamp from (stat)[9]
and reapply with utime
. And DateTime.pm required 3 prerequisites, one of which required Module::Build. Eventually I'll hook up the CPAN<->Debian magic, but not until after I upgrade the OS, so that was out.
So, old trick -- separate the problem into easy steps.
perl -MPOSIX=strftime -MFile::Find -le 'find( { wanted=>\&foo , follow=>1}, "/"); sub foo {return if -M $_ > 0; my $ts=strftime ("%Y%m%d%H%M.%S", localtime ((stat($_))[9])); return unless $ts=~s/\b(202[45])/$1-20/e; print "touch -t $ts $File::Find::name";}' \ | tee touch-2025 $ (set -x; . ./touch-2025) + . ./touch-2025 ++ touch -t 200502052006.08 / ++ touch -t 200412192026.04 /homex ++ touch -t 200412192133.13 /homex/wdr ++ touch -t 200412192026.04 /homex/wdr/.bashrc ++ touch -t 200412192026.04 /homex/wdr/.bash_profile ...
Of course, I tested it as an unprivileged user before running it as root
from /
(via sudo bash
).
hwclock --systohc
work?
my $dt = DateTime->from_epoch( epoch => (stat $file)[9] );
$dt->subtract( years => 20 );
utime $dt->epoch, $dt->epoch, $file;