Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
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 lurking in the Monastery: (12)
As of 2014-07-31 20:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (253 votes), past polls