Why specifically ls and not a for-loop? The for-loop would be the easier approach, and in addition it won't break on directories containing whitespace or quotes, like you'll get problems with when parsing ls output.
–
geirhaNov 9 '11 at 15:57

Swap pwd for your script. And . for the root directory name, if it's not the "current" directory.

You have to wrap the exec clause in bash -c "..." because of the way -exec works. cd doesn't exist in its limited environment, but as you can see by running the above command, when you bring in bash to do the job, everything runs as predicted.

The find command is pretty handy. It can generate a list of files or directorise in or below a specified directory, and it can also execute a command on each item in that list of results. (Note: if you're using a multi-user system, make sure to read the security considerations section of the Findutils documentation for the find command.)

The options to the find command that we need are -type d which tells find to return the names of every directory within the specified path, and -exec command '{}' \; which tells find to run command on the results. For example:

find /media/music/flac -type d -exec ~/tag-flac-with-rg.sh '{}' \;

This tells find to return every directory in or below the path /media/music/flac and then run the tag-flac-with-rg.sh script on each directory found. The '{}' is replaced by each directory name found, and gets passed as an argument to the tag-flac-with-rg.sh script. The \; marks the end of the arguments list to the tag-flac-with-rg.sh script.
may be this will help u

Just for curiosity I tried to take your example and make it work. There is no reason to use this technique instead of the find command.

Note: Thanks to enzotib for pointing it out, this does not work for directory names containing spaces or any other characters that
make awk think the name consists of several fields.

To make your example work a few tweaks should be made. But at first see the code:

ls -l | grep ^d | awk '{print $NF}' | xargs -n 1 bash -c 'cd $0; ls'

The first two commands make sure that only directories are listed. Since ls long listing contains a d as the first character for directories, the grep command selects only these lines.

With awk only the last column is displayed in every line. NF is a built-in variable in awk holding the maximum number of fields. Thus printing $NF displays the last field.

Finally xargs needed to be tamed to run the specified script with only one parameters at a time. (I know this kind-of defeats its purpose.) Otherwise the script could not be run for every directory without a for loop.

And to work around the built-in cd barrier, we call bash with -c. Also note that $0 becomes the first parameter instead of $1.

Unfortunately, if you have directories names containing spaces, $NF gives only the last word of the name. This is one of the reason why people is suggested to not parse ls output.
–
enzotibNov 9 '11 at 15:15

This is a valid point and I do not see an easy workaround without creating a lengthy awk script. I was trying to demonstrate how the original thinking could work (and to convince the OP not to use it, because it is at least not elegant). Thank you for pointing it out, I'll update the answer.
–
lgarzoNov 9 '11 at 15:23