bin/archive-dir

Tue, 17 Jan 2017 21:31:24 -0500

author
Meredith Howard <mhoward@roomag.org>
date
Tue, 17 Jan 2017 21:31:24 -0500
changeset 476
0938f35f78f9
child 477
eeafc178ddc4
permissions
-rwxr-xr-x

add archive-dir

#!/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