On 3 Jan 2007 at 8:02, Tom Messmer wrote:
> Hello everyone,
Hello and welcome,
> Just joined this list and I have a doozie I've been working on for a
> bit here to no avail. The entire problem is this; I have a list of
> files, say that they are named "flynn.foo, flynn_something.foo,
> flaherty.foo flaherty_something.foo" and so forth. Each of these
> files must live(be moved to) an individual directory named for the
> author(flynn, flaherty, etc) and then be symlinked to an entirely
> different directory in another part of the filesystem identical to
> the first one(flynn, flaherty...) If I was doing this on the command
> line I'd do
>
> cp /usr/blah/flaherty.foo /usr/blah/blahagain/flaherty/ &&
> ln -s /usr/blah/blahagain/flaherty/flaherty.foo /usr/blah/
> blahoncemore/flaherty.foo
>
> So far I've gotten to the point where I can strip out the names
> from the files and create the two sets of directories, but I'm
> stumped on how to them copy each of these files into the correct
> directory and then symlink from the storage directory to the other
> name directory. Now I know how to copy files and symlink files with
> perl, but the logic involved in doing this to 30 files is beyond me
> at the moment. Anyone have a clue?
This is a hard one to test. I haven't created the file structure you
described so YOU MUST TEST IT. I think you'll get better suggestions
from the list in time but I thought I'd have a shot anyway (I await
the rebukes).
I'll leave the symlink for you (perldoc -f symlink). Try this... it
might get you started.
Good luck,
Dp.
#!/usr/bin/perl # or where ever your perl is installed.
use strict;
use warnings;
use File::Copy;
use File::Basename;
my $source_dir = '/usr/blah';
my $distin_dir = '/usr/blany/blanagain/';
# Open the dir for reading or die.
opendir(DIR,$source_dir) or die "Can't open $source_dir: $!\n";
# Collect the author directories (and names).
my @auth_dir = grep { -f "$source_dir/$_" } readdir(DIR);
foreach my $i (@auth_dir) {
# Get the filename of the file from /usr/blab/flynn.foo
my $pathname = "$source_dir/$i";
# Grab the author from flynn.foo, splitting on the period.
# method 1 via regex
my ($author,$file) = ($i =~ /(\w+)\.(\w+)/);
# method 2 via split
my @f = split(/\./,$i);
# Going with method 2 for the moment.
my $dist = $distin_dir.$f[0];
print "Copying $pathname-> $dist.$f[1]\n";
#Keep commented until your sure.
# copy($i,$dist) or die "Can't copy $i -> $dist: $!\n";
}
print "Done...\n";
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/