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.