Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

move files to directories based on criteria

by metaperl (Curate)
on Jul 10, 2009 at 18:20 UTC ( #778993=snippet: print w/ replies, xml ) Need Help??

Description: We have a log directory full of files that we need to move out into different directories. I looked around for log file rotation utilities and found none. So I set out to write something. I first looked at various File::* modules but found none of them as easy as plain old File::Find. For usage at your site, customize the functions find_root_dir and categorize.
#!/usr/bin/perl

use strict;
use warnings;

use lib '../..' ;

use File::Copy;
use File::Find;
use File::Path;

my $root_dir = find_root_dir; 
our $prefix;


sub wanted {
    my ($file)=$_;

    return if -d $file;

    return if $File::Find::dir ne $root_dir;

    my $dir_to_make = categorize($file);

    File::Path::make_path($dir_to_make);

    File::Copy::move($file, $dir_to_make);

}

sub find_root_dir {

    use Local::Config;
    Local::Config->new->logdir;

}
 
sub categorize {
    my($file)=@_;

    substr($file, 0, 5);
}

File::Find::find(\&wanted, $root_dir);




# thanks to jhannah in #perl-help

# [09:52] <metaperl_work> Is there a utility to move files into a dire
+ctory based on a prefix of the name?
# [09:54] <mxf> "mv foo* bar/"?
# [09:54] <metaperl_work> mxf, yes, but there are tons of files which 
+must be automatically moved and directories created for them
# [09:55] <jhannah> trivial to write one?
# [09:55] <metaperl_work> jhannah, I suppose I need one of the File::F
+ind modules to do it
# [09:55] <metaperl_work> people seem to lieke F::F::Rules?
# [09:55] <mxf> metaperl_work, Ah, i see.
# [09:55] <jhannah> why? glob the dir in question, split your prefix, 
+create the dirs, move files
# [09:56] <jhannah> how is this more than 6 lines of perl?
# [09:56] <metaperl_work> for file in <*> { ... }
# [09:56] <metaperl_work> for my $file <*> { ... }
# [09:56] <metaperl_work> ?
# [09:56] <metaperl_work> next unless -f $file
# [09:56] <jhannah> foreach $file (glob "/path/to/dir") {  }
# [09:56] <jhannah> my $file

Comment on move files to directories based on criteria
Download Code
Re: move files to directories based on criteria
by ikegami (Pope) on Jul 10, 2009 at 19:05 UTC

    return if $File::Find::dir ne $root_dir;

    You're traversing an entire tree even though you ignore all results from subdirectories. Very wasteful! I think the solution is:

    sub wanted { my ($file)=$_; if (-d $file) { $File::Find::prune = 1; return; } my $dir_to_make = categorize($file); File::Path::make_path($dir_to_make); File::Copy::move($file, $dir_to_make); }

    Error checking would be useful.

Re: move files to directories based on criteria
by metaperl (Curate) on Jul 10, 2009 at 19:25 UTC
    Here's a version that moves files to a multi-level destination of YYYY/MM/DD/HH
    #!/usr/bin/perl use strict; use warnings; use lib '../..' ; use File::Copy; use File::Find; use File::Path; use File::Stat; my $root_dir = find_root_dir(); our $prefix; sub wanted { my ($file)=$_; return if -d $file; return if $File::Find::dir ne $root_dir; my $dir_to_make = categorize($file); File::Path::make_path($dir_to_make); File::Copy::move($file, $dir_to_make); } sub find_root_dir { use Local::Config; Local::Config->new->logdir; } sub categorize { my($file)=@_; my $stat = File::Stat->new($file); #substr($file, 0, 5); use DateTime; my $dt = DateTime->from_epoch( epoch => $stat->mtime, time_zone => 'EST' ); my $path = $dt->ymd('/'); $path .= "/" . $dt->hour; $path; } File::Find::find(\&wanted, $root_dir); # thanks to jhannah in #perl-help

Back to Snippets Section

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://778993]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (9)
As of 2014-12-28 23:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (183 votes), past polls