I am trying to write a script that will loop through directories, and rename the file in the sub directory to match that of the directory name. I am running into an issue where if a directory has spaces in the name, then that name is split up and I can't do anything with it like I need to.

For example, the folder structure is:

->this is a test

My script so far is:

for dir in $(ls $topLevel)
    echo $dir # for testing purposes to make sure i'm getting the right thing
    # Get name of directory - i know how to do this
    # Rename file to match the name of the directory, with the existing extension - i know how to do this

My expected output would be

/dir1/dir2/TopLevel/this is a test

However, the actual output is


Can someone point me in the right direction? It's been awhile since I've done shell scripting. I'm trying to take this script one piece at a time and I seem to be stuck on getting this iteration down.


This is one of the main reasons why you should never try to parse the output of ls. If you just use shell globs, you can do:

for dir in /dir1/dir2/TopLevel/*/
    echo "$dir" ## note the quotes, those are essential


  • Note how I use for dir in /dir1/dir2/TopLevel/*/ and not just for dir in /dir1/dir2/TopLevel/*. This is to only iterate over directories. If you want both directories and files, use for f in /dir1/dir2/TopLevel/*.

  • The quotes around $dir are essential, you should always quote variables, especially if they contain whitespace.

Further reading:

| improve this answer | |
  • Great, thank you for the assistance! – AutomatedOrder Jul 13 at 16:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.