<?xml version="1.0" encoding="windows-1252"?>
<node id="778993" title="move files to directories based on criteria" created="2009-07-10 14:20:46" updated="2009-07-10 14:20:46">
<type id="1980">
snippet</type>
<author id="36219">
metaperl</author>
<data>
<field name="doctext">
</field>
<field name="snippetdesc">
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 [mod://File::Find].

For usage at your site, customize the functions find_root_dir and categorize.
</field>
<field name="snippetcode">
&lt;CODE&gt;
#!/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-&gt;new-&gt;logdir;

}
 
sub categorize {
    my($file)=@_;

    substr($file, 0, 5);
}

File::Find::find(\&amp;wanted, $root_dir);




# thanks to jhannah in #perl-help

# [09:52] &lt;metaperl_work&gt; Is there a utility to move files into a directory based on a prefix of the name?
# [09:54] &lt;mxf&gt; "mv foo* bar/"?
# [09:54] &lt;metaperl_work&gt; mxf, yes, but there are tons of files which must be automatically moved and directories created for them
# [09:55] &lt;jhannah&gt; trivial to write one?
# [09:55] &lt;metaperl_work&gt; jhannah, I suppose I need one of the File::Find modules to do it
# [09:55] &lt;metaperl_work&gt; people seem to lieke F::F::Rules?
# [09:55] &lt;mxf&gt; metaperl_work, Ah, i see.
# [09:55] &lt;jhannah&gt; why? glob the dir in question, split your prefix, create the dirs, move files
# [09:56] &lt;jhannah&gt; how is this more than 6 lines of perl?
# [09:56] &lt;metaperl_work&gt; for file in &lt;*&gt; { ... }
# [09:56] &lt;metaperl_work&gt; for my $file &lt;*&gt; { ... }
# [09:56] &lt;metaperl_work&gt; ?
# [09:56] &lt;metaperl_work&gt; next unless -f $file
# [09:56] &lt;jhannah&gt; foreach $file (glob "/path/to/dir") {  }
# [09:56] &lt;jhannah&gt; my $file

&lt;/CODE&gt;</field>
</data>
</node>
