I have a lot of files I\'m trying to rename, I tried to make a regular expression to match them, but even that I got stuck on the files are named like:
<
I think mmv is your friend here.
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'
A bit overkill maybe, but it does what is asked.
if your remote has bash shell
for i in File*;
do
case "${i##* }" in [0-9][0-9] )
echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;;
esac;
done
remove "echo" to do actual renaming
Is this a one-time thing? If so, I'm going to suggest something that might seem to be a cop out by many programmers here:
Pipe the output of your command (find -type d | sort -r | grep ' [1-9][0-9]$'
) to a file and use an editor along with some global search/replace magic to create a script that does the renames.
Then throw away the script.
There's little fuss and little chance that you'll end up shooting yourself in the foot by having some attempt at a clever (but inadequately debugged) one-liner go off into the weeds on your files.
In my debian it works well with rename, tested with 300 files.
perl -e 'map `touch door$_.txt`, 1..300;'
rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e'
or something like that, provided
-print0
and -0
)