#!/usr/bin/perl use strict; use warnings; use File::Find; use Data::Dumper; use Win32::Hardlink; use Image::ExifTool qw/ImageInfo/; my $source = "C:\\Photos"; my $dest = "C:\\Photos_Organized"; my $main = { Dates => {}, Tags => {}, }; find(\&wanted, $source); sub wanted { my $file = $File::Find::name ; if (-f $file) { my $date_tag = ''; my $info = ImageInfo($file,['XmpmetaSubject','CreateDate']); my @keywords = map { $info->{$_} } grep { /^XmpmetaSubject/ } keys %$info; if (defined $info->{CreateDate} && $info->{CreateDate} =~ /^(\d\d\d\d):(\d\d):(\d\d)/) { $date_tag = "$1/$2/$3"; } add_picture($main, $file, $_, $date_tag, @keywords); print "$file [", join(",", @keywords), "] [$date_tag] \n"; } } sub build_dir { my $dir = shift; unless (-d $dir) { mkdir $dir or die "Failed to create $dir: $!"; } } sub link_tag { my ($base_dir, $src, $file_name, $tags) = @_; my $base_tag = ''; my @tags = split /\//, $tags; for (@tags) { $base_tag .= "$_\\"; build_dir($base_dir . $base_tag); my $dest = $base_dir . $base_tag . $file_name; unlink($dest) if -f $dest; link($src=> $dest); } } sub add_picture { my ($main, $file, $name, $date, @tags) = @_; my ($y,$m,$d) = split /\//, $date; link_tag("$dest\\By Date\\", $file, $name, $date); link_tag("$dest\\By Tag\\", $file, $name, $_) for @tags; link_tag("$dest\\By Tag\\", $file, $name, 'All'); } #### #!/usr/bin/perl use strict; use warnings; use Win32::ChangeNotify; #thanks to perlmonks node 366446 use Win32::ReadDirectoryChanges; use Data::Dumper; $|++; my $filter = FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SIZE ; my $path = "C:\\Photos"; my $rdc = Win32::ReadDirectoryChanges->new(path => $path, subtree => 1, filter => $filter); while (1) { print "Waiting for changes..."; my @results = $rdc->read_changes; print "changed!\n"; my $old_name; while (scalar @results) { my ($action, $filename) = splice(@results, 0, 2); if ($action == FILE_ACTION_ADDED ) { print "ADDED $filename\n"; } elsif ($action == FILE_ACTION_REMOVED) { print "REMOVED $filename\n"; } elsif ($action == FILE_ACTION_MODIFIED) { print "MODIFIED $filename\n"; } elsif ($action == FILE_ACTION_RENAMED_OLD_NAME) { $old_name = $filename; } elsif ($action == FILE_ACTION_RENAMED_NEW_NAME) { print "RENAMED $old_name TO $filename\n"; $old_name = ''; } } }