On Sat, Jan 22, 2011 at 2:56 PM, Shlomi Fish <shlo...@iglu.org.il> wrote:
> Hi Raphael, > > On Saturday 22 Jan 2011 11:03:28 raphael() wrote: > > Hello, > > > > qmv.exe (from renameutils) lets you edit multiple filenames in a text > > editor. > > I cannot get it to work in cygwin 1.7x (gives fork + jump error ??). So I > > tried to write it in Perl. > > > > qmv's format is simple > > > > filename-1 <empty space> filename_1_to_be_edited > > filename 2 <empty space> filename_2_to_be_edited > > filename_3 <empty space> filename_3_to_be_edited > > > > You edit the names and then it renames the files you have changed. > Problem > > I am having is how can I split the two file names by space > > since file name itself might also have spaces in them. > > > > I tried something like this > > > > ( $OldFileName, $NewFileName ) = split /\s{5,}/; > > > > 1. You should use my here so the variables will be declared the closest to > their usage. > > 2. You shouldn't use "$_". > > 3. Please avoid CamelCase names. > > > It works but not always. > > When doesn't it work? Can you give a test case? > > Regards, > > Shlomi Fish > > > I also thought to use and alternate anchor like pipe or comma but it > looks > > ugly. > > Beside qmv.exe uses space to separate file names Any help would be > > appreciated. Thanks. > > -- > ----------------------------------------------------------------- > Shlomi Fish http://www.shlomifish.org/ > "The Human Hacking Field Guide" - http://shlom.in/hhfg > > Chuck Norris can make the statement "This statement is false" a true one. > > Please reply to list if it's a mailing list post - http://shlom.in/reply . > Thanks for the reply. CamelCase Names ~ my first time as I saw few people using it and thought what was the attraction! I am usually _underscore_ guy. -- CODE -- use strict; use warnings; use File::Temp; use Sort::Naturally; use Getopt::Std 'getopts'; my ( %opts ); getopts('vfephc:', \%opts); &usage if $opts{h}; my ( %hash, %files ); my $tmp = File::Temp->new(); my $filename = $tmp->filename(); my @selected_files = $opts{c} ? glob "$opts{c}" : glob "*"; if ( $opts{f} ) { @selected_files = grep { -f $_ } @selected_files } %files = map { $_ => $_ } @selected_files ; for my $file ( nsort keys %files ) { printf { $tmp } "%s %65s\n", $file, $files{$file}; # THIS CAUSES UNINITIALIZED ERROR IF FILE NAME IS VERY LONG . THE REASON FOR PREVIOUS QUESTION } # HOW DO I SEPARATE TWO FILE NAMES? my $editor = $opts{e} // 'C:\cygwin\bin\vim-nox.exe'; system( "$editor", $filename ); open my $FH, '<', $filename or exit $!; my @names = <$FH>; close( $FH ); for ( @names ) { chomp; # GIVES WARNINGS IF I RUN THE COMMAND UT DON"T EDIT ANYTHING my ( $OldFileName, $NewFileName ) = split /\s{5,}/; # WAS DECLARED DIDN'T COPY IT IN MAIL $hash{$OldFileName} = $NewFileName; # DON'T USE CAMEL CASE } for my $key ( keys %files ) { next if ( $files{$key} eq $hash{$key} ); # skip rename if file with edited name exists unless ( -e $hash{$key} ) { if ( $opts{p} or $opts{v} ) { print "[$key] => [$hash{$key}]\n"; next if $opts{p} ; } rename( $key, $hash{$key} ); } } sub usage { print STDERR << "EOF"; usage: perl qmv.pl -e -p -v -c'*.extension' -c selection custom files like -c'*.rar' -e editor -f files only (default is files and folders) -h help (this message!) -p print-only do not rename -u undo all changes (not implemented yet) -v verbose similar to -p but renames files EOF exit 0; } -- CODE END -- See comments for question. Its a mess of code. I know.