You can use this:
for f in $(find -type f)
do
bn=$(basename $f) # file name
dn=$(dirname $f) # directory name
newfile=${dn}/$(basename ${dn}).${bn##*.}
echo mv ${f} ${newfile}
done
One-liner:
$ for f in $(find -type f); do bn=$(basename $f); dn=$(dirname $f); echo mv $f ${dn}/$(basename ${dn}).${bn##*.}; done
If the output is what you expect remove the echo
.
Breakdown:
find -type f # find all files
dirname somefile # directory name from entry (/1/2/3 -> /1/2)
basename somefile # filename from entry (/1/2/3 -> 3)
${somefile##*.} # get file extension
Sample (cygwin*):
reut@reut-pc ~/test
$ find -type f
./abc/123.456
./def/a.bc
reut@reut-pc ~/test
$ for f in $(find -type f); do bn=$(basename $f); dn=$(dirname $f); echo mv $f ${dn}/$(basename ${dn}).${bn##*.}; done
mv ./abc/123.456 ./abc/abc.456
mv ./def/a.bc ./def/def.bc