From 2dbb147f602abaa3eabb5ccb003a84acfc9c0b95 Mon Sep 17 00:00:00 2001 From: Zeus Panchenko Date: Wed, 3 May 2006 21:59:52 +0000 Subject: file aggregation via option --aggr-template has been implemented. control code for file name originality has been moved from template2name() to main(). README edited git-svn-id: file:///svnroot/renrot/trunk@88 fe2816f4-e837-0410-b10a-f608c9d244a1 --- ChangeLog | 7 +++++- README | 9 +++++++- renrot | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 77 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 651959c..15973d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,12 @@ $Log$ +Revision 1.57 2006/05/03 21:59:52 zeus +file aggregation via option --aggr-template has been implemented. +control code for file name originality has been moved from template2name() to main(). +README edited + Revision 1.56 2006/05/02 19:08:59 zeus item about aggregation is added to TODO. -minor language ixes in README +minor language ixes in README. Revision 1.55 2006/05/02 09:07:02 andy Wrote RESTRICTIONS section in README. diff --git a/README b/README index ec94c27..16a317a 100644 --- a/README +++ b/README @@ -8,7 +8,7 @@ of project is short form of 'REName and ROTate' and no other interpretation will be used. Renrot is intended to work only in current directory with all files of the -extension, specified after --ext. You can change the behaviour by specify +extension, specified after --ext. You can change the behaviour by specifying --work-directory option. New template ideology was implemented. It includes flexibility in file name @@ -28,6 +28,8 @@ Furthermore, the script can put a comment to: Personal data could be specified via XMP tags defined in configuration file. +In addition renrot can aggregate all files in directories according the given +date/time pattern template, set with --aggr-template. WHY RenRot? @@ -41,6 +43,7 @@ namely RenRot? Because: libjpeg6 (the best open tool to operate JPEG format files, to correctly rotate both, the very file and the thumbnail inside it); - it has very much flex file naming template engine; + - it has very much flex file aggregation template engine; - it works in batch mode. @@ -61,6 +64,10 @@ applications of the script: rename each file according to the given template renrot --name-template="01.%c.%Y%m%d%H%M%S.%i.%E%F%W%I" --ext JPG + rename each file according to the given template and files aggregation + according the date + renrot --name-template="%y%m%d%H%M%S.%i" --aggr-template "%Y%m%d" --ext JPG + rotate each file and their thumbnail by 90CW in specified directory renrot --rotate 90 --ext '*.jpg' --work-directory="/tmp/images" diff --git a/renrot b/renrot index 5aa5a64..3fa6e61 100755 --- a/renrot +++ b/renrot @@ -19,6 +19,7 @@ my $rotateThumbnail; # define the angle, to rotate on, 90 or 270 my $noRename; # no rename needed, default is to rename to the YYYYmmddHHMMSS.jpg my $noComment; # no comment needed my $nameTemplate; # template for the filename taken from CLI +my $aggrTemplate; # template for the files aggregation taken from CLI my $extentionToProcess; # the extention of files to work with my $extentionToProcessLowCase; # lowercased extention of files to work with my $usageOutput = 0; # flag to show the usage @@ -71,6 +72,7 @@ sub getopt { "no-rename" => \$noRename, "comment-file=s" => \$comfile, "name-template=s" => \$nameTemplate, + "aggr-template=s" => \$aggrTemplate, "mtime" => \$mtime, "config-file|c=s" => \$configFile, "v+" => \$verbose, @@ -247,15 +249,23 @@ foreach $file ( @files ) { # if ( defined $noRename ) { infomsg ("No renaming asked, filename is left untouched.\n"); - $newfilename = $file; + if ( ($newfilename) = ( $file =~ /^(.*)\.jpg/ ) ) { + $filenameshash{$newfilename} = 1; + } } else { - $newfilename = sprintf("%s.%s", template2name($NameTemplate), $extentionToProcessLowCase); + $newfilename = template2name($NameTemplate); + if ( $filenameshash{$newfilename} ) { + $newfilename = sprintf("%s.%.4d",$newfilename,$filecounter); + } + $filenameshash{$newfilename} = 1; + + $newfilename = sprintf("%s.%s", $newfilename, $extentionToProcessLowCase); if ( $file ne $newfilename ) { if ( -f $newfilename ) { - fatalmsg ("File $newfilename already exists!\n"), die - }; + fatalmsg ("File $newfilename already exists!\n"), die; + } rename ( $file, $newfilename ) || ( fatalmsg ("Unable to rename $file -> $newfilename.\n"), die ); print "Renamed: $file -> $newfilename\n"; @@ -342,6 +352,27 @@ foreach $file ( @files ) { closedir(DIR); +######################################################################################## +# +# file aggregation if requested +# +if ( defined $aggrTemplate ) { + infomsg ("NOW IS FILE AGGREGATION\n=======================\n\n"); + $filecounter=1; + foreach $file ( sort ( keys %filenameshash ) ) { + $file .= ".jpg"; + $info = $exifTool->ImageInfo($file); + $newfilename = template2name($aggrTemplate); + if ( not -d $newfilename ) { + unless ( mkdir $newfilename ) { errmsg ("$newfilename wasn't created!\n"); } + } + infomsg ( "$file has been aggregated to the directory $newfilename\n" ); + $newfilename .= "/" . $file; + rename ( $file, $newfilename ) || ( fatalmsg ("$file -> $newfilename\n"), die ); + $filecounter++; + } +} + exit 0; ######################################################################################## @@ -404,7 +435,7 @@ sub getTimestamp { $timestamp = timeNow(); warnmsg ("EXIF timestamp isn't correct, using timeNow()!\n"); } - + return $timestamp; } @@ -553,6 +584,7 @@ infomsg ( it's for the files which were rotated, but thumbnail wasn't --no-rename no rename needed, default is to rename to the YYYYmmddHHMMSS.jpg --name-template filename template (see manual for details) + --aggr-template aggregation template (see manual for details) --mtime to set file mtime according DateTimeOriginal tag value --comment-file file with commentary --version the version of this script @@ -637,12 +669,6 @@ sub template2name { else { $thename .= $substrchar; } } - if ( $filenameshash{$thename} ) { - $thename = sprintf("%s.%s",$thename,$templatehash{"c"}); - } - - $filenameshash{$thename} = 1; - return $thename; } @@ -659,7 +685,7 @@ renrot [OPTIONS] =head1 DESCRIPTION B is intended to work ONLY in current directory. You can change the -behaviour by specify B<--work-directory> option. +behaviour by specifying B<--work-directory> option. Renrot renames files according the DateTimeOriginal and FileModifyDate EXIF tags, if they exist. Otherwise, the name will be set according to the current @@ -684,6 +710,9 @@ The script can also put commentary into: Personal details can be specified via XMP tags defined in a configuration file, look L section. +In addition renrot can aggregate all files in directories according the given +date/time pattern template, set with B<--aggr-template>. + =head1 OPTIONS =over @@ -780,6 +809,28 @@ B<%y> last two digits of year (00..99) =back +=item B<--aggr-template> I + +template, which is used for file aggregation. Aggragation fulfils according date/time patterns. + +=over + +B<%d> day of the month (01-31) + +B<%H> hour (00-23) + +B<%M> minute (00-59) + +B<%m> month (01-12) + +B<%S> second (00-59) + +B<%Y> year (1900, 1901, and so on) + +B<%y> last two digits of year (00..99) + +=back + =back =head1 B -- cgit v1.2.1