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