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