I am trying to recurse into folders and then run commands on them, using bash script. Any suggestions?
-
3The problem is unclear. Do you simply want to use find to execute a command on all the files beneath a given directory? – William Pursell Aug 26 '09 at 10:48
-
3the answer is in my down vote then :) – drAlberT Aug 26 '09 at 10:48
-
I just want to rename all the files under a directory – miro Aug 27 '09 at 01:53
7 Answers
If you want to recurse into directories, executing a command on each file found in those, I would use the find
command, instead of writing anything using shell-script, I think.
That command can receive lots of parameters, like type
to filter the types of files returned, or exec
to execute a command on each result.
For instance, to find directories that are under the one I'm currently in :
find . -type d -exec echo "Hello, '{}'" \;
Which will get me somehthing like :
Hello, '.'
Hello, './.libs'
Hello, './include'
Hello, './autom4te.cache'
Hello, './build'
Hello, './modules'
Same to find the files under the current directory :
find . -type f -exec echo "Hello, '{}'" \;
which will get me something like this :
Hello, './config.guess'
Hello, './config.sub'
Hello, './.libs/memcache_session.o'
Hello, './.libs/memcache_standard_hash.o'
Hello, './.libs/memcache_consistent_hash.o'
Hello, './.libs/memcache.so'
Hello, './.libs/memcache.lai'
Hello, './.libs/memcache.o'
Hello, './.libs/memcache_queue.o'
Hello, './install-sh'
Hello, './config.h.in'
Hello, './php_memcache.h'
...
Some would say "it's not shell"... But why re-invent the wheel ?
(And, in a way, it is shell ^^ )
For more informations, you can take a look at :
man find
- lots of tutorials found with google, like, for instance, Unix Find Command Tutorial

- 146,289
- 39
- 203
- 257

- 395,085
- 80
- 655
- 663
-
If you need to rename directories as well as files recursively check out this answer: http://stackoverflow.com/questions/4268591/unix-rename-files-directories-to-uppercase – JJones Dec 11 '13 at 08:59
-
thanks. how would i adjust this to look just for sub-directories of my current directory, and not look for sub-sub directories – Zach Smith Oct 18 '17 at 09:51
-
ah. like this: `find . -maxdepth 1 -type d -exec echo "Hello, '{}'" \;` – Zach Smith Oct 18 '17 at 09:52
-
How do I make it use a function? I have it defined with `wavogg() { stuff }` and `find` just says `'wavogg': No such file or directory` – Aaron Franke Mar 19 '19 at 23:26
-
Actually, it also doesn't seem to work with `cd`... `find . -type d -exec cd "'{}'" \;` – Aaron Franke Mar 19 '19 at 23:27
Bash 4.0 introduced the globstar option, so a construct like:
for f in mydir/**/*
do
# operations here
done
...will act recursively on whatever lands in $f. Turn this on with "shopt -s globstar", otherwise the ** will be treated as a singular *.
Found this gem today at http://www.linuxjournal.com/content/globstar-new-bash-globbing-option, after being inspired by the zsh construct (which I have enabled by default).

- 321
- 2
- 2
Some basic shells miss commands like 'find' and some of their commands don't support recursivity. In that case you can use this script to run the desired command in all subdirs in the tree:
CDIR=$(pwd)
for i in $(ls -R | grep :); do
DIR=${i%:} # Strip ':'
cd $DIR
$1 # Your command
cd $CDIR
done
If you name the above "recurse.sh" then use:
./recurse.sh <command>
Example (change the owner/group to 'root' of all files in the tree):
./recurse.sh "chown 0:0 *"

- 91
- 1
- 1
Have a look at the find
command and check the switches -type
(use d to specify directory) and -exec
(to specify a command to execute).

- 10,607
- 1
- 36
- 64
Sorry I don't understand what you are asking. The best I can guess with your question is
find -type d -exec scriptname.sh \{\} \;

- 14,561
- 3
- 44
- 81
For most recursive file operations, you want to use find
, as the other answers explain.
There is an example of a recursive bash script included in the bash-doc package. If you've got those examples installed, it will be at /usr/share/doc/bash/examples/functions/recurse
(on Debian).

- 68,372
- 23
- 116
- 141