tar will do this for you really fast.
TEST
First I created 2 directories and 10 files:
% mkdir test1 test2 ; cd test1
% for n in `seq 1 10` ; do touch ABC.file$n ; done
% ls
> ABC.file1 ABC.file2 ABC.file4 ABC.file6 ABC.file8
> ABC.file10 ABC.file3 ABC.file5 ABC.file7 ABC.file9
Then I copied them:
% tar -cf - ./* |\
tar -C../test2 --transform='s/ABC/DEF/' -xf -
% ls ../test2
> DEF.file1 DEF.file2 DEF.file4 DEF.file6 DEF.file8
> DEF.file10 DEF.file3 DEF.file5 DEF.file7 DEF.file9
TRANSFORM
So GNU tar will accept a sed --transform=EXPRESSION for file renaming. This can even rename only some of the files. For instance:
% tar -cf - ./* |\
tar -C../test2 --transform='s/ABC\(.*[0-5]\)/DEF\1/' -xf -
% ls ../test2
> ABC.file6 ABC.file8 DEF.file1 DEF.file2 DEF.file4
> ABC.file7 ABC.file9 DEF.file10 DEF.file3 DEF.file5
So that's one advantage.
STREAM
Also consider that this is only two tar processes - and that will not alter regardless of your file count.
tar | tar
tar is as optimized as you could want it to be. This will never have problem argument counts or runaway child processes. This is just A > B done.
ARGUMENTS
I use 7 distinct arguments combined between my two tar processes here. The most important one is listed here first:
- stdout/stdin - this informs tar that it will be streaming either its input or output to or from stdin/stdout which it will interpret correctly depending on whether or not it is building or extracting an archive.
-c create - this tells tar to build the archive. The next argument tar expects is...
-f file - we specify that tar will be working with a file object rather than a tape-device or whatever. And the file it will be working with, as noted above, is stdin/stdout - in other words, our |pipe.
./* all $PWD/files - not too much to explain here except that the archive argument comes first, so - then ./*.
...and on the other side of the |pipe...
-C change directory - this informs tar that it needs to change to the directory I specify before performing any other action, so effectively it just cd ../test2 before extraction.
--transform='s/ed/EXPR/' - as has already been mentioned, this did the renaming. But the docs indicate that it can take any sed expression or //flag.
-x extract - after tar changes to our target directory and receives our renaming instructions we instruct it to begin extracting all of the files into its current directory from the -f - |pipe archive file. No mystery.
mcfile manager has a most extensive support for this sort of mass renames.taris no spring-chicken, either. See my answer for an example.