summaryrefslogtreecommitdiff
path: root/examples/functions/recurse
diff options
context:
space:
mode:
Diffstat (limited to 'examples/functions/recurse')
-rw-r--r--examples/functions/recurse63
1 files changed, 63 insertions, 0 deletions
diff --git a/examples/functions/recurse b/examples/functions/recurse
new file mode 100644
index 0000000..f69cd50
--- /dev/null
+++ b/examples/functions/recurse
@@ -0,0 +1,63 @@
+#!/bin/bash
+
+#From: kaz@ashi.footprints.net (Kaz Kylheku)
+#Newsgroups: comp.os.linux.misc
+#Subject: Re: bash question: subdirectories
+#Message-ID: <slrn8a0gu9.v5n.kaz@ashi.FootPrints.net>
+#Date: Tue, 08 Feb 2000 16:24:35 GMT
+
+#Actually it can be made to. That is to say, it is possible to code a recursive
+#descender function in the bash language. Here is an example.
+#
+#What is nice about this is that you can embed the function into your shell
+#script. The function changes the current working directory as it descends.
+#So it can handle arbitrarily deep paths. Whereas paths generated by the
+#find command can cause a problem when they get too long; the kernel has a
+#hard limit on the length of the string passed to the open() and other
+#system calls.
+
+#There are races; what if the directory tree is blown away during the traversal?
+#The function won't be able to crawl back up using the .. link and will just
+#bail.
+
+# Recursive Directory Traverser
+# Author: Kaz Kylheku
+# Date: Feb 27, 1999
+# Copyright 1999
+
+# Function parameter usage:
+# $1 directory to search
+# $2 pattern to search for
+# $3 command to execute
+# $4 secret argument for passing down path
+
+function recurse
+{
+ local file
+ local path
+
+ if [ "$4" = "" ] ; then
+ path="${1%/}/"
+ else
+ path="$4$1/"
+ fi
+
+ if cd "$1" ; then
+ for file in $2; do
+ if [ -f "$file" ] || [ -d "$file" ]; then
+ eval "$3"
+ fi
+ done
+ for file in .* * ; do
+ if [ "$file" = "." ] || [ "$file" = ".." ] ; then
+ continue
+ fi
+ if [ -d "$file" ] && [ ! -L "$file" ]; then
+ recurse "$file" "$2" "$3" "$path"
+ fi
+ done
+ cd ..
+ fi
+}
+
+recurse "$1" "$2" 'echo "$path$file"'