bin/archive-dir

changeset 476
0938f35f78f9
child 477
eeafc178ddc4
new file mode 100755
--- /dev/null
+++ b/bin/archive-dir
@@ -0,0 +1,55 @@
+#!/usr/bin/env perl
+
+use warnings;
+use strict;
+use Time::Piece;
+use Path::Tiny;
+use Getopt::Long::Descriptive;
+
+sub main {
+  my ($opt, $usage) = describe_options(
+    'archive-dir %o <directory> ...',
+    ['dest|d=s' => "destination path"],
+    ['subdir'   => hidden => {
+      one_of => [
+        ['year|y'  => 'file by year'],
+        ['month|m' => 'file by month'],
+      ],
+      default => 'year',
+      }
+    ],
+    ['age|a=i' => "minimum age in days for archival", {default => 60}],
+    ['yes|y'   => "actually move files"],
+    ['help|h'  => "print usage message and exit", {shortcircuit => 1}],
+  );
+  print($usage->text), exit if $opt->help;
+
+  archive_dir($opt, $_) for @ARGV;
+}
+
+sub archive_dir {
+  my $opt     = shift;
+  my $dir     = path(shift);
+  my $destdir = path($opt->dest // '.');
+     $destdir = $dir->child($destdir) if $destdir->is_relative;
+  my $destfmt = ($opt->subdir eq 'month') ? '%Y-%m' : '%Y';
+  my $nowish  = time;
+  my $age     = $opt->age * 24 * 60 * 60;
+
+  for my $child ($dir->children) {
+    next if $child->is_dir && ($child eq $destdir || $child =~ /^(?:\d{4}|\d\d)$/);
+
+    my $mtime = $child->stat->mtime;
+    next unless ($nowish - $mtime) >= $age;
+
+    my $dest = $destdir->child(localtime($mtime)->strftime($destfmt));
+
+    print "$dest \t $child\n";
+
+    next unless $opt->yes;
+    $dest->mkpath;
+    $child->move($dest . '/' . $child->relative($dir));
+  }
+}
+
+main();

mercurial