I have a bunch of directories with different names within the current directory:

Hello World/
Dr. Dre - Still Dre/
Angry Birds/
2018 Grand Prix Race Highlights/

And within each of those directories are files (one in each, respectively):


And I want to rename each file to their directory name but the extension shouldn't change. Sample output files:

Hello World.c
Dr. Dre - Still Dre.aac
Angry Birds.apk
2018 Grand Prix Race Highlights.mp4

Output location does not matter.

I've found so many solutions for renaming files within the current dir that use for file in * and mv "$file" "${file/oldname/newname}" but my files are in subdirectories 1 level deep so what I currently have is:

for dir in */
  cd ${dir}
  file=$(echo *)
  mv "*" "${dir}.${ext}"
  cd ${currdir}

I'm using zsh and when I try to run this function I get zsh: source.c not found which I suspect might be something wrong with the line file=$(echo *). I also don't like the complication of what I did there so maybe there's a cleaner way of doing it or even a one-liner. I only want to use commands which are already installed by default in Ubuntu such as mv, find, sed, vim, grep, etc. The directory names might have symbol characters like $, &, ., etc. so please accommodate weird names also.


1 Answer 1


I'd just do:

autoload zmv
zmv '(*)/(*)(.*)' '$1$3'

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .