Вопрос

Many sites (including various SO articles) talk about using "rename" using Perl expressions to rename files.

This would be perfect, but apparently this is not the rename utility I have, and none of these articles seem to comprehend that there are multiple versions of "rename" and I can't seem to find where to get version that accepts Perl expressions.

How can I get my hands on the more powerful rename utility mentioned here, here, and here?

I'm running Fedora 20. My current rename command is from the util-linux package and apparently I need the Perl version, which is better.

Это было полезно?

Решение

I can only speak for Debian. The two programs are called

  • /usr/bin/rename.ul from the util-linux package (hence the .ul suffix)
  • /usr/bin/prename from the perl package

The actual rename command works via the /etc/alternatives mechanism, whereby

  • /usr/bin/rename is a symlink to /etc/alternatives/rename
  • /etc/alternatives/rename is a symlink to /usr/bin/prename

The same problem has been bugging me on Cygwin, which is a Red Hat product, so should be more similar to Fedora. I'll have a look on my company laptop on Monday. And I remember the Perl-rename having worked there sometimes. Probably before I installed util-linux.

If you install the Perl-rename to /usr/local/bin it will have precedence over rename from util-linux. Same goes for the manpage when installed to /usr/local/share/man/man1/.

I've just created a separate Perl-rename package on Github: https://github.com/subogero/rename

Другие советы

You can install it using cpan, which is the perl repository similar to pip for python.

Here is a tutorial on using cpan.

If you try to run rename it it looks like this

rename --help
call: rename from to files...

To install the perl rename you can do the following. You might need to install a few dependencies, you can generally just push enter

cpan
cpan1> install File::Rename
CPAN: Storable loaded ok (v2.20)
Going to read '/root/.cpan/Metadata'
Database was generated on Wed, 30 Sep 2015 08:17:02 GMT
Running install for module 'File::Rename'
....
Running Build install
Installing /usr/local/share/man/man1/rename.1
Installing /usr/local/share/perl5/File/Rename.pm
Installing /usr/local/share/man/man3/File::Rename.3pm
Installing /usr/local/bin/rename
Writing /usr/local/lib64/perl5/auto/File/Rename/.packlist
RMBARKER/File-Rename-0.20.tar.gz
./Build install -- OK

That is how you would install the rename from cpan.
Next is to get it working on your system. As you might have more then one rename installed.

which rename  
/usr/bin/rename  

When you actually want this one.

/usr/local/bin/rename --help
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E *perlexpr*]*|*perlexpr*
    [ *files* ]

Options:
    -v, -verbose
            Verbose: print names of files successfully renamed.

    -n, -nono
            No action: print names of files to be renamed, but don't rename.

    -f, -force
            Over write: allow existing files to be over-written.

    -h, -help
            Help: print SYNOPSIS and OPTIONS.

    -m, -man
            Manual: print manual page.

    -V, -version
            Version: show version number.

    -e      Expression: code to act on files name.

            May be repeated to build up code (like "perl -e"). If no -e, the
            first argument is used as code.

    -E      Statement: code to act on files name, as -e but terminated by
            ';'.

I just put it into /usr/bin/ but with a slight different name to make sure I did not break any existing scripts / programs the depend on the old one.

ln -s /usr/local/bin/rename /usr/bin/rename.pl

I had to do the following:

# In bash
sudo yum install perl-CPAN
sudo cpan

# In CPAN shell
install Module::Build
install File::Rename

On RedHat 8.4

sudo yum install perl-CPAN
sudo cpan
install module::Build
install File::Rename

than you can create an alias:

alias prename='/usr/local/bin/rename'

An example:

touch pic.jpeg
prename 's/\.jpeg$/.jpg/' *.jpeg

Here you create an empty file with the .jpeg extension. The next line renames all the files with .jpeg extension in the current directory: it removes the e from the jpeg extension of these files. (The first line is there to be sure that there is at least one file like that in the directory.)

For Arch Linux, its

sudo pacman -S perl-rename

For Debian-family (.deb) distros, I recommend @SzG's answer.

For RedHat-family (.rpm) distros (e.g. Fedora), if your time is precious (like mine), you can download, compile, and install, from source via cpan in one, terse command:

# Install (replace `rename-1.9` below with another version if desired)
curl -L "http://search.cpan.org/CPAN/authors/id/P/PE/PEDERST/rename-1.9.tar.gz" | tar -xz && ( cd "rename-1.9"; perl "Makefile.PL"; make && make install )

# Cleanup
rm -rf "rename-1.9"

Note:

INSTALL_BASE can be set to modify the base installation directory.

e.g. perl "Makefile.PL" INSTALL_BASE=/usr/local

source

I created a post about Perl's rename for many distro:

https://unix.stackexchange.com/a/727288/12574

  • rpm based distros:
    • dnf install prename
  • archlinux:
    • pacman -S perl-rename
  • *BSD:
    • pkg install p5-File-Rename
  • Debian like/Ubuntu
    • apt install rename
  • slackware:

I recently had to install the glorious Perl rename package to Alpine Linux in a Docker container for a Gitlab CI/CD operation:

apk update
apk add --no-cache make perl-utils
cpan File::Rename
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top