#!/usr/bin/env perl
|
|
|
|
=pod
|
|
|
|
=head1 NAME
|
|
|
|
photocp - copy files from digital camera media to my home dir
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
# try a couple of defaults
|
|
photocp
|
|
|
|
# look in source_directory
|
|
photocp [source_directory]
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
This operates on a handful of assumptions, some of which are becoming obsolete
|
|
as "cameras" are mostly phones these days:
|
|
|
|
=over
|
|
|
|
=item A given source will have a bunch of unique filenames.
|
|
|
|
=item You're only likely to be copying from one source on a given day.
|
|
|
|
=item You want to copy all of the files on the source (this is the big one).
|
|
|
|
=back
|
|
|
|
=head1 AUTHOR
|
|
|
|
Brennen Bearnes
|
|
|
|
=cut
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use 5.10.0;
|
|
use POSIX qw(strftime);
|
|
use File::Basename;
|
|
use File::Copy;
|
|
use File::Find;
|
|
use File::HomeDir;
|
|
|
|
my $home = File::HomeDir->my_home;
|
|
my $archive_dir = $home . '/workspace/photos';
|
|
|
|
unless (-d $archive_dir) {
|
|
die "$archive_dir is not a directory";
|
|
}
|
|
|
|
my @sources = (
|
|
'/media/' . $ENV{'USER'} . '/EOS_DIGITAL',
|
|
'/media/' . $ENV{'USER'} . '/CANON_DC',
|
|
'/media/' . $ENV{'USER'} . '/NIKON D600',
|
|
'/media/' . $ENV{'USER'} . '/NO NAME',
|
|
'/media/' . $ENV{'USER'} . '/9016-4EF8',
|
|
'/media/CANON_DC',
|
|
'/media/EOS_DIGITAL',
|
|
'/media/disk/DCIM',
|
|
'/media/NIKON D600',
|
|
'/run/user/1000/gvfs/' # XXX: this is fairly stupid.
|
|
);
|
|
|
|
my @t = localtime;
|
|
my $daydir = strftime("%Y-%m-%d", @t);
|
|
|
|
my $src;
|
|
if ((defined $ARGV[0]) && (-d $ARGV[0])) {
|
|
$src = $ARGV[0];
|
|
} else {
|
|
foreach my $source (@sources) {
|
|
if (-d $source) {
|
|
$src = $source;
|
|
last;
|
|
}
|
|
}
|
|
unless ($src) {
|
|
die 'source not mounted? tried ' . join(' ', @sources);
|
|
}
|
|
}
|
|
|
|
my $dest = $archive_dir . '/' . $daydir;
|
|
|
|
if ((-e $dest) && (! -d $dest)) {
|
|
die 'target exists but is not a directory';
|
|
}
|
|
|
|
if (! -d $dest) {
|
|
say "creating $dest";
|
|
mkdir($dest);
|
|
} else {
|
|
say "$dest exists";
|
|
}
|
|
|
|
my $count = 0;
|
|
|
|
# XXX: What this doesn't *really* handle is the case where you sync
|
|
# from multiple cameras and they have overlapping filenames for
|
|
# the same sync date.
|
|
|
|
find(
|
|
sub {
|
|
if ( /[.] (jpe?g | mpe?g | mp4 | avi | raw | cr2 | tiff? | bmp | png | gif | mov) $/ix ) {
|
|
$count++;
|
|
my $copy_to = "$dest/$_";
|
|
|
|
if (-e $copy_to) {
|
|
say "$copy_to already exists - skipping copy";
|
|
} else {
|
|
say "copying $File::Find::name to $copy_to";
|
|
copy($File::Find::name, $copy_to)
|
|
or die "copy failed: $!";
|
|
}
|
|
|
|
}
|
|
},
|
|
$src
|
|
);
|
|
|
|
say "$count files copied";
|