qmv (renameutils) for cygwin using perl

2011-01-22 Thread raphael()
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-1empty spacefilename_1_to_be_edited
filename 2empty spacefilename_2_to_be_edited
filename_3empty spacefilename_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,}/;

It works but not always.
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.


Re: qmv (renameutils) for cygwin using perl

2011-01-22 Thread Shlomi Fish
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-1empty spacefilename_1_to_be_edited
 filename 2empty spacefilename_2_to_be_edited
 filename_3empty spacefilename_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 .

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/




Re: qmv (renameutils) for cygwin using perl

2011-01-22 Thread raphael()
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-1empty spacefilename_1_to_be_edited
  filename 2empty spacefilename_2_to_be_edited
  filename_3empty spacefilename_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 DONT 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.