Rename files and directories recursively under ubuntu /bash
A solution using find
:
To rename files only:
find /your/target/path/ -type f -exec rename 's/special/regular/' '{}' \;
To rename directories only:
find /your/target/path/ -type d -execdir rename 's/special/regular/' '{}' \+
To rename both files and directories:
find /your/target/path/ -execdir rename 's/special/regular/' '{}' \+
If you don't mind installing another tool, then you can use rnm:
rnm -rs '/special/regular/g' -dp -1 *
It will go through all directories/sub-directories (because of -dp -1
) and replace special with regular in their names.
@speakr's answer was the clue for me.
If using -execdir to transform both files and directories, you'll also want to remove -type f
from the example shown. To spell it out, use:
find /your/target/path/ -execdir rename 's/special/regular/' '{}' \+
Also, consider adding g
(global) flag to the regex if you want to replace all occurrences of special
with regular
in a given filename and not just the first occurrence. For example:
find /your/target/path/ -execdir rename 's/special/regular/g' '{}' \+
will transform special-special.jpg
to regular-regular.jpg
. Without the global flag, you'll end up with regular-special.jpg
.
FYI: GNU Rename is not installed by default on Mac OSX. If you are using the Homebrew package manager, brew install rename
will remedy this.
Try doing this (require bash --version
>= 4):
shopt -s globstar
rename -n 's/special/regular/' **
Remove the -n
switch when your tests are OK
There are other tools with the same name which may or may not be able to do this, so be careful.
If you run the following command (GNU
)
$ file "$(readlink -f "$(type -p rename)")"
and you have a result like
.../rename: Perl script, ASCII text executable
and not containing:
ELF
then this seems to be the right tool =)
If not, to make it the default (usually already the case) on Debian
and derivative like Ubuntu
:
$ sudo update-alternatives --set rename /path/to/rename
(replace /path/to/rename
to the path of your perl's rename
command.
If you don't have this command, search your package manager to install it or do it manually
Last but not least, this tool was originally written by Larry Wall, the Perl's dad.