Imported from ../bash-2.05.tar.gz.
[platform/upstream/bash.git] / examples / functions / recurse
1 #!/bin/bash
2
3 #From: kaz@ashi.footprints.net (Kaz Kylheku)
4 #Newsgroups: comp.os.linux.misc
5 #Subject: Re: bash question: subdirectories
6 #Message-ID: <slrn8a0gu9.v5n.kaz@ashi.FootPrints.net>
7 #Date: Tue, 08 Feb 2000 16:24:35 GMT
8
9 #Actually it can be made to. That is to say, it is possible to code a recursive
10 #descender function in the bash language. Here is an example. 
11 #
12 #What is nice about this is that you can embed the function into your shell
13 #script. The function changes the current working directory as it descends.
14 #So it can handle arbitrarily deep paths. Whereas paths generated by the
15 #find command can cause a problem when they get too long; the kernel has a
16 #hard limit on the length of the string passed to the open() and other
17 #system calls. 
18
19 #There are races; what if the directory tree is blown away during the traversal?
20 #The function won't be able to crawl back up using the .. link and will just
21 #bail.
22
23 # Recursive Directory Traverser
24 # Author: Kaz Kylheku
25 # Date: Feb 27, 1999
26 # Copyright 1999
27
28 # Function parameter usage:
29 # $1 directory to search
30 # $2 pattern to search for
31 # $3 command to execute
32 # $4 secret argument for passing down path
33
34 function recurse
35 {
36     local file
37     local path
38
39     if [ "$4" = "" ] ; then
40         path="${1%/}/"
41     else
42         path="$4$1/"
43     fi
44
45     if cd "$1" ; then
46         for file in $2; do
47             if [ -f "$file" -o -d "$file" ]; then
48                 eval "$3"
49             fi
50         done
51         for file in .* * ; do
52             if [ "$file" = "." -o "$file" = ".." ] ; then
53                 continue
54             fi
55             if [ -d "$file" -a ! -L "$file" ]; then
56                 recurse "$file" "$2" "$3" "$path"
57             fi
58         done
59         cd ..
60     fi
61 }
62
63 recurse "$1" "$2" 'echo "$path$file"'
64