[Pdx-pm] command line question
Thomas J Keller
kellert at ohsu.edu
Mon Jul 12 16:38:57 CDT 2004
This also a nice program, and works for normally named files, but not
for goofy filenames containing spaces.
Thanks though,
TK
On Jul 12, 2004, at 2:27 PM, Eric Wilhelm wrote:
> # The following was supposedly scribed by
> # Colin Kuskie
> # on Monday 12 July 2004 04:16 pm:
>
>> The original perl distribution used to include a program called rename
>> that allowed you to pass a line of perl code that would modify each
>> filename in any way you want.
>
> Debian still does this (it's in the 'perl' package.) Redhat had a
> compiled
> 'rename' which used a different pattern language
>
> I prefer the regex-based pattern expression.
>
> --Eric
>
> $cat `which rename`
> #!/usr/bin/perl -w
> #
> # This script was developed by Robin Barker (Robin.Barker at npl.co.uk),
> # from Larry Wall's original script eg/rename from the perl source.
> #
> # This script is free software; you can redistribute it and/or modify
> it
> # under the same terms as Perl itself.
> #
> # Larry(?)'s RCS header:
> # RCSfile: rename,v Revision: 4.1 Date: 92/08/07 17:20:30
> #
> # $RCSfile: rename,v $$Revision: 1.5 $$Date: 1998/12/18 16:16:31 $
> #
> # $Log: rename,v $
> # Revision 1.5 1998/12/18 16:16:31 rmb1
> # moved to perl/source
> # changed man documentation to POD
> #
> # Revision 1.4 1997/02/27 17:19:26 rmb1
> # corrected usage string
> #
> # Revision 1.3 1997/02/27 16:39:07 rmb1
> # added -v
> #
> # Revision 1.2 1997/02/27 16:15:40 rmb1
> # *** empty log message ***
> #
> # Revision 1.1 1997/02/27 15:48:51 rmb1
> # Initial revision
> #
>
> use strict;
>
> use Getopt::Long;
> Getopt::Long::Configure('bundling');
>
> my ($verbose, $no_act, $force, $op);
>
> die "Usage: rename [-v] [-n] [-f] perlexpr [filenames]\n"
> unless GetOptions(
> 'v|verbose' => \$verbose,
> 'n|no-act' => \$no_act,
> 'f|force' => \$force,
> ) and $op = shift;
>
> $verbose++ if $no_act;
>
> if (!@ARGV) {
> print "reading filenames from STDIN\n" if $verbose;
> @ARGV = <STDIN>;
> chop(@ARGV);
> }
>
> for (@ARGV) {
> my $was = $_;
> eval $op;
> die $@ if $@;
> next if $was eq $_; # ignore quietly
> if (-e $_ and !$force)
> {
> warn "$was not renamed: $_ already exists\n";
> }
> elsif ($no_act or rename $was, $_)
> {
> print "$was renamed as $_\n" if $verbose;
> }
> else
> {
> warn "Can't rename $was $_: $!\n";
> }
> }
>
> __END__
>
> =head1 NAME
>
> rename - renames multiple files
>
> =head1 SYNOPSIS
>
> B<rename> S<[ B<-v> ]> S<[ B<-n> ]> S<[ B<-f> ]> I<perlexpr> S<[
> I<files> ]>
>
> =head1 DESCRIPTION
>
> C<rename>
> renames the filenames supplied according to the rule specified as the
> first argument.
> The I<perlexpr>
> argument is a Perl expression which is expected to modify the C<$_>
> string in Perl for at least some of the filenames specified.
> If a given filename is not modified by the expression, it will not be
> renamed.
> If no filenames are given on the command line, filenames will be read
> via standard input.
>
> For example, to rename all files matching C<*.bak> to strip the
> extension,
> you might say
>
> rename 's/\.bak$//' *.bak
>
> To translate uppercase names to lower, you'd use
>
> rename 'y/A-Z/a-z/' *
>
> =head1 OPTIONS
>
> =over 8
>
> =item B<-v>, B<--verbose>
>
> Verbose: print names of files successfully renamed.
>
> =item B<-n>, B<--no-act>
>
> No Action: show what files would have been renamed.
>
> =item B<-f>, B<--force>
>
> Force: overwrite existing files.
>
> =back
>
> =head1 ENVIRONMENT
>
> No environment variables are used.
>
> =head1 AUTHOR
>
> Larry Wall
>
> =head1 SEE ALSO
>
> mv(1), perl(1)
>
> =head1 DIAGNOSTICS
>
> If you give an invalid Perl expression you'll get a syntax error.
>
> =head1 BUGS
>
> The original C<rename> did not check for the existence of target
> filenames,
> so had to be used with care. I hope I've fixed that (Robin Barker).
>
> =cut
> _______________________________________________
> Pdx-pm-list mailing list
> Pdx-pm-list at mail.pm.org
> http://mail.pm.org/mailman/listinfo/pdx-pm-list
More information about the Pdx-pm-list
mailing list