117721Speter#! /bin/sh
217721Speter#
3175261Sobrien# Copyright (C) 1995-2005 The Free Software Foundation, Inc.
4175261Sobrien#
5175261Sobrien# This program is free software; you can redistribute it and/or modify
6175261Sobrien# it under the terms of the GNU General Public License as published by
7175261Sobrien# the Free Software Foundation; either version 2, or (at your option)
8175261Sobrien# any later version.
9175261Sobrien#
10175261Sobrien# This program is distributed in the hope that it will be useful,
11175261Sobrien# but WITHOUT ANY WARRANTY; without even the implied warranty of
12175261Sobrien# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13175261Sobrien# GNU General Public License for more details.
14175261Sobrien#
1517721Speter# descend - walk down a directory tree and execute a command at each node
1617721Speter
1717721Speterfullname=$0
1817721Spetername=descend
1917721Speterusage="Usage: $name [-afqrv] command [directory ...]\n
2017721Speter\040\040-a\040\040All: descend into directories starting with '.'\n
2117721Speter\040\040-f\040\040Force: ignore errors during descent\n
2217721Speter\040\040-q\040\040Quiet: don't print directory names\n
2317721Speter\040\040-r\040\040Restricted: don't descend into RCS, CVS.adm, SCCS directories\n
2417721Speter\040\040-v\040\040Verbose: print command before executing it"
2517721Speter
2617721Speter# Scan for options
2717721Speterwhile getopts afqrv option; do
2817721Speter    case $option in
2917721Speter	a)
3017721Speter	    alldirs=$option
3117721Speter	    options=$options" "-$option
3217721Speter	    ;;
3317721Speter	f)
3417721Speter	    force=$option
3517721Speter	    options=$options" "-$option
3617721Speter	    ;;
3717721Speter	q)
3817721Speter	    verbose=
3917721Speter	    quiet=$option
4017721Speter	    options=$options" "-$option
4117721Speter	    ;;
4217721Speter	r)
4317721Speter	    restricted=$option
4417721Speter	    options=$options" "-$option
4517721Speter	    ;;
4617721Speter	v)
4717721Speter	    verbose=$option
4817721Speter	    quiet=
4917721Speter	    options=$options" "-$option
5017721Speter	    ;;
5117721Speter	\?)
5217721Speter	    /usr/5bin/echo $usage 1>&2
5317721Speter	    exit 1
5417721Speter	    ;;
5517721Speter    esac
5617721Speterdone
5717721Spetershift `expr $OPTIND - 1`
5817721Speter
5917721Speter# Get command to execute
6017721Speterif [ $# -lt 1 ] ; then
6117721Speter    /usr/5bin/echo $usage 1>&2
6217721Speter    exit 1
6317721Speterelse
6417721Speter    command=$1
6517721Speter    shift
6617721Speterfi
6717721Speter
6817721Speter# If no directory specified, use '.'
6917721Speterif [ $# -lt 1 ] ; then
7017721Speter    default_dir=.
7117721Speterfi
7217721Speter
7317721Speter# For each directory specified
7417721Speterfor dir in $default_dir "$@" ; do
7517721Speter
7617721Speter    # Spawn sub-shell so we return to starting directory afterward
7717721Speter    (cd $dir
7817721Speter
7917721Speter	# Execute specified command
8017721Speter	if [ -z "$quiet" ] ; then
8117721Speter	    echo In directory `hostname`:`pwd`
8217721Speter	fi
8317721Speter	if [ -n "$verbose" ] ; then
8417721Speter	    echo $command
8517721Speter	fi
8617721Speter	eval "$command" || if [ -z "$force" ] ; then exit 1; fi
8717721Speter
8817721Speter	# Collect dot file names if necessary
8917721Speter	if [ -n "$alldirs" ] ; then
9017721Speter	    dotfiles=.*
9117721Speter	else
9217721Speter	    dotfiles=
9317721Speter	fi
9417721Speter
9517721Speter	# For each file in current directory
9617721Speter	for file in $dotfiles * ; do
9717721Speter
9817721Speter	    # Skip '.' and '..'
9917721Speter	    if [ "$file" = "." -o "$file" = ".." ] ; then
10017721Speter		continue
10117721Speter	    fi
10217721Speter
10317721Speter	    # If a directory but not a symbolic link
10417721Speter	    if [ -d "$file" -a ! -h "$file" ] ; then
10517721Speter
10617721Speter		# If not skipping this type of directory
10717721Speter		if [ \( "$file" != "RCS" -a \
10817721Speter			"$file" != "SCCS" -a \
10917721Speter			"$file" != "CVS" -a \
11017721Speter			"$file" != "CVS.adm" \) \
11117721Speter			-o -z "$restricted" ] ; then
11217721Speter
11317721Speter		    # Recursively descend into it
11417721Speter		    $fullname $options "$command" "$file" \
11517721Speter		    || if [ -z "$force" ] ; then exit 1; fi
11617721Speter		fi
11717721Speter
11817721Speter	    # Else if a directory AND a symbolic link
11917721Speter	    elif [ -d "$file" -a -h "$file" ] ; then
12017721Speter
12117721Speter		if [ -z "$quiet" ] ; then
12217721Speter		    echo In directory `hostname`:`pwd`/$file: symbolic link: skipping
12317721Speter		fi
12417721Speter	    fi
12517721Speter	done
12617721Speter    ) || if [ -z "$force" ] ; then exit 1; fi
12717721Speterdone
128