Blame


1 1ddd2d4e 2023-09-10 jrmu #!/usr/bin/perl
2 1ddd2d4e 2023-09-10 jrmu
3 1ddd2d4e 2023-09-10 jrmu # The Professor modified some files on Monday afternoon and now he's
4 1ddd2d4e 2023-09-10 jrmu # forgotten which ones they were. This happens all the time. He wants you
5 1ddd2d4e 2023-09-10 jrmu # to make a subroutine called gather_mtime_between, which, given a starting
6 1ddd2d4e 2023-09-10 jrmu # and ending timestamp, returns a pair of coderefs. The first one will be
7 1ddd2d4e 2023-09-10 jrmu # used with File::Find to gather the names of only the items that were
8 1ddd2d4e 2023-09-10 jrmu # modified between those two times; the second one you can use to get the
9 1ddd2d4e 2023-09-10 jrmu # list of items found.
10 1ddd2d4e 2023-09-10 jrmu
11 1ddd2d4e 2023-09-10 jrmu # Here's some code to try; it should list only items that were last
12 1ddd2d4e 2023-09-10 jrmu # modified on the most recent Monday, although you could easily change it
13 1ddd2d4e 2023-09-10 jrmu # to work with a different day.
14 1ddd2d4e 2023-09-10 jrmu #
15 1ddd2d4e 2023-09-10 jrmu # Hint: We can find a file's timestamp (mtime) with code such as:
16 1ddd2d4e 2023-09-10 jrmu #
17 1ddd2d4e 2023-09-10 jrmu # $ my timestamp = (stat $file_name)[9];
18 1ddd2d4e 2023-09-10 jrmu #
19 1ddd2d4e 2023-09-10 jrmu # Because it's a slice, remember that those parentheses are mandatory.
20 1ddd2d4e 2023-09-10 jrmu # Don't forget that the working directory inside the callback isn't
21 1ddd2d4e 2023-09-10 jrmu # necessarily the starting directory from which we called find:
22 1ddd2d4e 2023-09-10 jrmu #
23 1ddd2d4e 2023-09-10 jrmu # Note the comment about DST. In many parts of the world, on the days when
24 1ddd2d4e 2023-09-10 jrmu # daylight saving time or summer time kicks in and out, the civil day is no
25 1ddd2d4e 2023-09-10 jrmu # longer 86,400 seconds long. The program glosses over this issue, but a
26 1ddd2d4e 2023-09-10 jrmu # more careful coder might take it into consideration appropriately.
27 1ddd2d4e 2023-09-10 jrmu
28 1ddd2d4e 2023-09-10 jrmu use v5.24;
29 1ddd2d4e 2023-09-10 jrmu use warnings;
30 1ddd2d4e 2023-09-10 jrmu use strict;
31 1ddd2d4e 2023-09-10 jrmu use utf8;
32 1ddd2d4e 2023-09-10 jrmu use local::lib;
33 1ddd2d4e 2023-09-10 jrmu use File::Find;
34 1ddd2d4e 2023-09-10 jrmu use Time::Local;
35 1ddd2d4e 2023-09-10 jrmu
36 1ddd2d4e 2023-09-10 jrmu sub gather_mtime_between {
37 1ddd2d4e 2023-09-10 jrmu my($start, $end) = @_;
38 1ddd2d4e 2023-09-10 jrmu my @files;
39 1ddd2d4e 2023-09-10 jrmu return (
40 1ddd2d4e 2023-09-10 jrmu sub {
41 1ddd2d4e 2023-09-10 jrmu my $mtime = (stat $_)[9];
42 1ddd2d4e 2023-09-10 jrmu if ($start < $mtime && $mtime < $end) {
43 1ddd2d4e 2023-09-10 jrmu push @files, $File::Find::name;
44 1ddd2d4e 2023-09-10 jrmu }
45 1ddd2d4e 2023-09-10 jrmu },
46 1ddd2d4e 2023-09-10 jrmu sub { wantarray? @files : [@files]; });
47 1ddd2d4e 2023-09-10 jrmu }
48 1ddd2d4e 2023-09-10 jrmu
49 1ddd2d4e 2023-09-10 jrmu my $target_dow = 1; # Sunday is 0, Monday is 1, ...
50 1ddd2d4e 2023-09-10 jrmu my @starting_directories = (".");
51 1ddd2d4e 2023-09-10 jrmu
52 1ddd2d4e 2023-09-10 jrmu my $seconds_per_day = 24 * 60 * 60;
53 1ddd2d4e 2023-09-10 jrmu my($sec, $min, $hour, $day, $mon, $yr, $dow) = localtime;
54 1ddd2d4e 2023-09-10 jrmu my $start = timelocal(0, 0, 0, $day, $mon, $yr); # midnight today
55 1ddd2d4e 2023-09-10 jrmu while ($dow != $target_dow) {
56 1ddd2d4e 2023-09-10 jrmu # Back up one day
57 1ddd2d4e 2023-09-10 jrmu $start -= $seconds_per_day; # hope no DST! :-)
58 1ddd2d4e 2023-09-10 jrmu if (--$dow < 0) {
59 1ddd2d4e 2023-09-10 jrmu $dow += 7;
60 1ddd2d4e 2023-09-10 jrmu }
61 1ddd2d4e 2023-09-10 jrmu }
62 1ddd2d4e 2023-09-10 jrmu my $stop = $start + $seconds_per_day;
63 1ddd2d4e 2023-09-10 jrmu
64 1ddd2d4e 2023-09-10 jrmu my($gather, $yield) = gather_mtime_between($start, $stop);
65 1ddd2d4e 2023-09-10 jrmu find($gather, @starting_directories);
66 1ddd2d4e 2023-09-10 jrmu my @files = $yield->( );
67 1ddd2d4e 2023-09-10 jrmu
68 1ddd2d4e 2023-09-10 jrmu for my $file (@files) {
69 1ddd2d4e 2023-09-10 jrmu my $mtime = (stat $file)[9]; # mtime via slice
70 1ddd2d4e 2023-09-10 jrmu my $when = localtime $mtime;
71 1ddd2d4e 2023-09-10 jrmu print "$when: $file\n";
72 1ddd2d4e 2023-09-10 jrmu }