Sun, 18 Feb 2018 16:11:32 -0500
Let's use Import::Base
476 | 1 | #!/usr/bin/env perl |
677 | 2 | |
549
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
3 | use 5.014; |
476 | 4 | use warnings; |
5 | use strict; | |
677 | 6 | |
689
840057d4b493
portability improvement
Meredith Howard <mhoward@roomag.org>
parents:
677
diff
changeset
|
7 | use lib glob('~/.lib/perl5'); |
677 | 8 | use Autofetch; |
9 | ||
476 | 10 | use Time::Piece; |
11 | use Path::Tiny; | |
12 | use Getopt::Long::Descriptive; | |
13 | ||
14 | sub main { | |
15 | my ($opt, $usage) = describe_options( | |
16 | 'archive-dir %o <directory> ...', | |
17 | ['dest|d=s' => "destination path"], | |
18 | ['subdir' => hidden => { | |
19 | one_of => [ | |
20 | ['year|y' => 'file by year'], | |
21 | ['month|m' => 'file by month'], | |
22 | ], | |
23 | default => 'year', | |
24 | } | |
25 | ], | |
26 | ['age|a=i' => "minimum age in days for archival", {default => 60}], | |
477
eeafc178ddc4
add -f for only plain files
Meredith Howard <mhoward@roomag.org>
parents:
476
diff
changeset
|
27 | ['files|f' => "operate on plain files only"], |
529 | 28 | ['yes|Y' => "actually move stuff"], |
476 | 29 | ['help|h' => "print usage message and exit", {shortcircuit => 1}], |
30 | ); | |
485
a58682115510
print usage on no args too
Meredith Howard <mhoward@roomag.org>
parents:
477
diff
changeset
|
31 | print($usage->text), exit if $opt->help || !@ARGV; |
476 | 32 | |
33 | archive_dir($opt, $_) for @ARGV; | |
34 | } | |
35 | ||
36 | sub archive_dir { | |
37 | my $opt = shift; | |
38 | my $dir = path(shift); | |
39 | my $destdir = path($opt->dest // '.'); | |
40 | $destdir = $dir->child($destdir) if $destdir->is_relative; | |
41 | my $destfmt = ($opt->subdir eq 'month') ? '%Y-%m' : '%Y'; | |
42 | my $nowish = time; | |
43 | my $age = $opt->age * 24 * 60 * 60; | |
44 | ||
549
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
45 | my @work; |
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
46 | |
476 | 47 | for my $child ($dir->children) { |
477
eeafc178ddc4
add -f for only plain files
Meredith Howard <mhoward@roomag.org>
parents:
476
diff
changeset
|
48 | next if $child->is_dir && ( |
eeafc178ddc4
add -f for only plain files
Meredith Howard <mhoward@roomag.org>
parents:
476
diff
changeset
|
49 | $opt->files || $child eq $destdir || $child =~ /^(?:\d{4}|\d\d)$/ |
eeafc178ddc4
add -f for only plain files
Meredith Howard <mhoward@roomag.org>
parents:
476
diff
changeset
|
50 | ); |
eeafc178ddc4
add -f for only plain files
Meredith Howard <mhoward@roomag.org>
parents:
476
diff
changeset
|
51 | next if $opt->files && $child->basename =~ /^\./; |
476 | 52 | |
53 | my $mtime = $child->stat->mtime; | |
54 | next unless ($nowish - $mtime) >= $age; | |
55 | ||
56 | my $dest = $destdir->child(localtime($mtime)->strftime($destfmt)); | |
549
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
57 | push @work, [$dest, $child]; |
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
58 | } |
476 | 59 | |
549
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
60 | my $lastdest = ''; |
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
61 | for my $work (sort {$a->[0] cmp $b->[0]} @work) { |
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
62 | my ($dest, $child) = @$work; |
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
63 | |
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
64 | say $lastdest = $dest |
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
65 | if $dest ne $lastdest; |
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
66 | |
0bd45054802e
sort and format plan before working
Meredith Howard <mhoward@roomag.org>
parents:
529
diff
changeset
|
67 | say "\t$child"; |
476 | 68 | |
69 | next unless $opt->yes; | |
70 | $dest->mkpath; | |
71 | $child->move($dest . '/' . $child->relative($dir)); | |
72 | } | |
73 | } | |
74 | ||
75 | main(); |