#!/bin/sh # dist-chmod --- fixup file/directory permissions recursively # Author: Noah Friedman # Public domain. # $Id: dist-chmod,v 1.5 2005/11/22 20:39:54 friedman Exp $ setgid= sticky= bits= owner= verbose= while : ; do case $1 in -1 ) bits=o ; shift ;; # legacy dist-chmod1 behavior -2 ) bits=og ; shift ;; # legacy dist-chmod2 behavior -v ) verbose=-v ; set -x ; shift ;; -w ) bits=$2 ; shift ; shift ;; +s ) setgid=,g+s ; shift ;; -s ) setgid=,g-s ; shift ;; +t ) sticky=,+t ; shift ;; -t ) sticky=,-t ; shift ;; -[ou] ) owner=$2 ; shift ; shift ;; --* ) : ; shift ; break ;; -?* ) opts=$1 # split single-letter options and reparse shift set fnord `echo $opts | sed -e 's/^-//;s/\(.\)/-\1 /g'` ${1+"$@"} shift ;; +* ) opts=$1 # split single-letter options and reparse shift set fnord `echo $opts | sed -e 's/^\+//;s/\(.\)/+\1 /g'` ${1+"$@"} shift ;; * ) break ;; esac done fmode=a+rw case $bits in '' ) : ;; *[=+-]* ) fmode=$fmode,$bits ;; * ) fmode=$fmode,${bits}-w ;; esac chmod $verbose -R $fmode ${1+"$@"} dmode=a+x$setgid$sticky,$fmode if find --version 2>&1 | grep 'GNU find' > /dev/null ; then find ${1+"$@"} ! -type l -type d -print0 \ | xargs --null --no-run-if-empty chmod $verbose $dmode else case $verbose in '' ) print= ;; * ) print=-print ;; esac find ${1+"$@"} ! -type l -type d $print -exec chmod $dmode '{}' ';' fi case $owner in '' ) exit $? ;; *:* ) : ;; *.* ) owner=`echo "$owner" | sed -e 's/\./:/'` ;; esac chown $verbose -h -R $owner ${1+"$@"} # eof