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