App-rename

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

	- Add --shell-completion=bash

1.12 Sun Nov 13 16:13:00 CET 2022
	- Add -c|--copy option

1.11 Tue Mar 23 13:41:00 CET 2021
     	- Fix examples in documentation

1.10 Fri Mar 19 22:00:12 CET 2021
	- Skip files containing 0-bytes
	- Fix a backup file issue related to wildcards

1.9  Fri Jul  4 02:51:17 CEST 2014
	- use bsd_glob to handle files with space in the name.

1.8  Sun Sep 19 20:19:36 CEST 2010
	- Ensure directories exist for backup files.

1.7  Sun Sep 19 19:47:47 CEST 2010
	- Fixed a long standing bug related to backup
	- Added --prefix, --basename-prefix and -z for --suffix
	- Updated documentation

1.6  Mon Aug 18 16:45:06 CEST 2008
	- inlined mkpath for better control of error messages.
	- turn of strict when evaling perl code.

1.5  Mon Aug 18 14:21:12 CEST 2008
	- use strict, added mkdir support, fixed small typos.

bin/rename.PL  view on Meta::CPAN

#line 33

Getopt::Long::config(qw(bundling));
$Getopt::Long::prefix = '--';

my $ME = $0;
($ME = $0) =~ s!.*/!!;
$| = 1;

my $opt_dryrun          = 0;
my $opt_backup          = 0;
my $opt_command         = undef;
my $opt_copy            = 0;
my $opt_force           = 0;
my $opt_interactive     = 0;
my $opt_verbose         = 0;
my $opt_help            = 0;
my $opt_stdin           = 1;
my $opt_version         = 0;
my $opt_linkonly        = 0;
my $opt_prefix          = '';

bin/rename.PL  view on Meta::CPAN

{
    local $SIG{__WARN__} = sub {
	if ($_[0] =~ /^Unknown option: (\S+)/) {
	    error("unrecognized option `--$1'");
	}
	else {
	    print @_;
	}
    };
    GetOptions(
	       'b|backup'             => \$opt_backup,		# [make a backup of each existing destionation file]
	       'c|copy'               => \$opt_copy,		# [copy files instead of rename]
	       'C|cmd|command=s'      => \$opt_command,         # [specify command to use instead of rename]
	       'B|prefix=s'           => \$opt_prefix,		# [set backup filename prefix]:backup filename prefix
	       'f|force'              => \$opt_force,		# [do not prompt before overwriting]
	       'g|git'                => sub { $opt_command = 'git mv' }, # [use git to move files instead of rename]
	       'h|help'               => \$opt_help,		# -[display help and exit]
	       'i|interactive'        => \$opt_interactive,	# [prompt before overwrite]
	       'l|link-only'          => \$opt_linkonly,	# [hard link files instead of rename]
	       'n|just-print|dry-run' => \$opt_dryrun,		# [don't rename, implies --verbose]
	       's|stdin!'             => \$opt_stdin,		# [read filenames from standard input]
	       'version'              => \$opt_version,		# -[output version information and exit]
	       'v|verbose'            => \$opt_verbose,		# [explain what is being done]
	       'V|version-control=s'  => \$opt_vcm,		# [set backup method]:backup method:(({none,off}\:never\ make\ backups\ \(even\ if\ --backup\ is\ given\) {numbered,t}\:make\ numbered\ backups {existing,nil}\:numbered\ if\ numbered\ backups\ exist,\ sim...
	       'Y|basename-prefix=s'  => \$opt_basename_prefix,	# [set backup file basename prefix]:backup basename prefix
	       'z|S|suffix=s'         => \$opt_suffix,		# [set backup filename suffix]:backup filename suffix
	       'shell-completion|shellcompletion=s' => \$opt_shellcompletion,
	      );
}

if ($opt_command) {
    if ($opt_backup) {
	error("error: --backup is incompatible with --cmd");
    }

    my $o = eval { sprintf $opt_command };
    unless ($o eq $opt_command) {
	error("error: --command parameter '$opt_command' contains format sequences");
    }

    my $count = () = $opt_command =~ /\{\}/g;
    unless ($count) {
	$opt_command .= " {} {}";

bin/rename.PL  view on Meta::CPAN

if ($opt_version) {
    print "$ME $VERSION\n";
    exit 0;
}

if ($opt_help) {
    print<<HELP;
Usage: $ME [OPTION]... PERLEXPR FILE...
Rename FILE(s) using PERLEXPR on each filename.

  -b, --backup                  make backup before removal
  -c, --copy                    copy file instead of rename
  -C, --commmand=COMMAND        use COMMAND instead of rename
  -B, --prefix=SUFFIX           set backup filename prefix
  -f, --force                   remove existing destinations, never prompt
  -g, --git                     use 'git mv' instead of rename
  -i, --interactive             prompt before overwrite
  -l, --link-only               link file instead of rename
  -n, --just-print, --dry-run   don't rename, implies --verbose
  -v, --verbose                 explain what is being done
  -V, --version-control=METHOD  override the usual version control
  -Y, --basename-prefix=PREFIX  set backup filename basename prefix
  -z, -S, --suffix=SUFFIX       set backup filename suffix
      --help                    display this help and exit
      --version                 output version information and exit

The backup suffix is ~, unless set with SIMPLE_BACKUP_SUFFIX.  The
version control may be set with VERSION_CONTROL, values are:

  none, off       never make backups (even if --backup is given)
  numbered, t     make numbered backups
  existing, nil   numbered if numbered backups exist, simple otherwise
  simple, never   always make simple backups

Report bugs to pederst\@cpan.org
HELP
    exit 0; #'
}

if ($opt_backup) {
    if ($opt_prefix || $opt_basename_prefix || $opt_suffix) {
	$vcm = VCM_SIMPLE;
    }
    else {
	$vcm = ${abbrev qw(none off nil existing t numbered never simple)}{$opt_vcm};
	error("invalid version contol type `$opt_vcm'") unless $vcm;
	$vcm = ${{ nil      => VCM_TEST,
		   existing => VCM_TEST,
		   t        => VCM_NUMBERED,
		   numbered => VCM_NUMBERED,
		   never    => VCM_SIMPLE,
		   simple   => VCM_SIMPLE,
		   none     => VCM_OFF,
		   off      => VCM_OFF,
		}}{$vcm};
    }
    if ($vcm == VCM_OFF) {
	$opt_backup = 0;
    }
    $opt_suffix ||= $ENV{SIMPLE_BACKUP_SUFFIX} || '~';
}

my $op = shift
    or error('missing arguments');

if (!@ARGV) {
    if ($opt_stdin) {
	@ARGV = <STDIN>;

bin/rename.PL  view on Meta::CPAN

	    if (! -w && -t) {
		printf "%s: overwrite `%s', overriding mode 0%03o? ",
		       $ME, $_, (stat _)[2]&0777;
		next unless <STDIN> =~ /^y/i;
	    }
	    elsif ($opt_interactive) {
		print "$ME: replace `$_'? ";
		next unless <STDIN> =~ /^y/i;
	    }
	}
	if ($opt_backup) {
	    my $old;
	    if ($vcm == VCM_SIMPLE) {
		if (m,^(.*/)?(.*),) {
		    $old = "$opt_prefix$1$opt_basename_prefix$2$opt_suffix";
		}
	    }
	    else {
		($old) = sort {($b=~/~(\d+)~$/)[0] <=> ($a=~/~(\d+)~$/)[0]} bsd_glob "\Q$_\E.~*~";
		$old =~ s/~(\d+)~$/'~'.($1+1).'~'/e;
		if ($vcm == VCM_TEST) {
		    unless ($old) {
			if (m,^(.*/)?(.*),) {
			    $old = "$opt_prefix$1$opt_basename_prefix$2$opt_suffix";
			}
		    }
		}
		elsif ($vcm == VCM_NUMBERED) {
		    $old ||= "$_.~1~";
		}
	    }
	    print "backup: $_ -> $old\n" if $opt_verbose && $opt_dryrun;

	    unless ($opt_dryrun) {
		if ($old =~ m,/,) {
		    my $dir = File::Basename::dirname($old);
		    unless (-d $dir) {
			if ($opt_dryrun) {
			    print "mkdir: $dir\n" if $opt_verbose;
			}
			else {
			    mkpath($dir) || next;

bin/rename.PL  view on Meta::CPAN

=head1 SYNOPSIS

B<rename>
[B<-bcfgilnv>]
[B<-B> I<prefix>]
[B<-C> I<command>]
[B<-S> I<suffix>]
[B<-V> I<method>]
[B<-Y> I<prefix>]
[B<-z> I<suffix>]
[B<--backup>]
[B<--command=>I<command>]
[B<--copy>]
[B<--basename-prefix=>I<prefix>]
[B<--dry-run>]
[B<--force>]
[B<--help>]
[B<--no-stdin>]
[B<--interactive>]
[B<--just-print>]
[B<--link-only>]

bin/rename.PL  view on Meta::CPAN


If a destination file is unwritable, the standard input is a tty, and the
B<-f> or B<--force> option is not given, rename prompts the user for whether
to overwrite the file.  If the response does not begin with `y' or `Y', the
file is skipped.

=head1 OPTIONS

=over 4

=item B<-b>, B<--backup>

Make backup files.  That is, when about to overwrite a file, rename the
original instead of removing it.  See the B<-V> or B<--version-control>
option fo details about how backup file names are determined.

=item B<-B> I<prefix>, B<--prefix=>I<prefix>

Use the B<simple> method to determine backup file names (see the B<-V>
I<method> or B<--version-control=>I<method> option), and prepend
I<prefix> to a file name when generating its backup file name.

=item B<-c>, B<--copy>

Copy files to the new names instead of renaming them. This will keep the
original files.

=item B<-C> I<command>, B<--cmd> I<command>, B<--command> I<command>

Use I<command> to process files instead of rename. I<command> can
contain two instances of {}, the first will be replaced with the

bin/rename.PL  view on Meta::CPAN


=item B<-l>, B<--link-only>

Link files to the new names instead of renaming them. This will keep the
original files.

=item B<-n>, B<--just-print>, B<--dry-run>

Do everything but the actual renaming, instead just print the name of
each file that would be renamed. When used together with B<--verbose>,
also print names of backups (which may or may not be correct depending
on previous renaming).

=item B<-v>, B<--verbose>

Print the name of each file before renaming it.

=item B<-V> I<method>, B<--version-control=>I<method>

Use I<method> to determine backup file names.  The method can also be
given by the B<RENAME_VERSION_CONTROL> (or if that's not set, the
B<VERSION_CONTROL>) environment variable, which is overridden by this
option.  This option does not affect whether backup files are made; it
affects only the name of any backup files that are made.

The value of I<method> is like the GNU Emacs `version-control' variable;
B<rename> also recognize synonyms that are more descriptive.  The valid
values are (unique abbreviations are accepted):

=over

=item B<existing> or B<nil>

Make numbered backups of files that already have them, otherwise simple
backups. This is the default.

=item B<numbered> or B<t>

Make numbered backups.  The numbered backup file name for I<F> is
B<I<F>.~I<N>~> where I<N> is the version number.

=item B<simple> or B<never>

Make simple backups.  The B<-B> or B<--prefix>, B<-Y> or
B<--basename-prefix>, and B<-z> or B<--suffix> options specify the
simple backup file name.  If none of these options are given, then a
simple backup suffix is used, either the value of
B<SIMPLE_BACKUP_SUFFIX> environment variable if set, or B<~> otherwise.

=back

=item B<--version>

Print version information on standard output then exit successfully.

=item B<-Y> I<prefix>, B<--basename-prefix=>I<prefix>

Use the B<simple> method to determine backup file names (see the B<-V>
I<method> or B<--version-control=>I<method> option), and prefix
I<prefix> to the basename of a file name when generating its backup file
name. For example, with B<-Y .del/> the simple backup file name for
B<a/b/foo> is B<a/b/.del/foo>.

=item B<-z> I<suffix>, B<-S> I<suffix>, B<--suffix=>I<suffix>

Use the B<simple> method to determine backup file names (see the B<-V>
I<method> or B<--version-control=>I<method> option), and append
I<suffix> to a file name when generating its backup file name.

=item B<--shell-completion=>I<shell>, B<--shellcompletion=>I<shell>

Generate shell code for parameter completion for either B<bash> or
B<zsh>.

=back

=head1 EXAMPLES

bin/rename.PL  view on Meta::CPAN


More examples:

    rename 's/\.flip$/.flop/' *     # rename *.flip to *.flop
    rename s/flip/flop/ *           # rename *flip* to *flop*
    rename 's/^s\.(.*)/$1.X/' *     # switch sccs filenames around
    rename 's/$/.orig/' */*.[ch]    # add .orig to source files in */
    rename 'y/A-Z/a-z/' *           # lowercase all filenames in .
    rename 'y/A-Z/a-z/ if -B' *     # same, but just binaries!
or even
    rename chop *~                  # restore all ~ backup files

Use --git when working within a GIT repo:

    # rename _-separated filenames to camel-case, using git mv
    rename --git 's/([a-z]+)_/\u\L$1/g' *.c

    # or just renaming all the *.yml files to *.yaml
    rename -g 's/\.yml$/.yaml/ *.yml

With the --command parameter you can make rename do other interesing



( run in 0.776 second using v1.01-cache-2.11-cpan-49f99fa48dc )