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
34function 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" ] || [ -d "$file" ]; then
48                eval "$3"
49            fi
50        done
51        for file in .* * ; do
52            if [ "$file" = "." ] || [ "$file" = ".." ] ; then
53                continue
54            fi
55            if [ -d "$file" ] && [ ! -L "$file" ]; then
56                recurse "$file" "$2" "$3" "$path"
57            fi
58        done
59        cd ..
60    fi
61}
62
63recurse "$1" "$2" 'echo "$path$file"'
64