#!/bin/sh # # A script to fix up executable permissions. # # Copyright (c) 2002, 2003, Igor Pechtchanski # # Written by Igor Pechtchanski # # This program is distributed under the terms of the GNU General Public # License. For more information see . # PROGNAME="`basename "$0"`" USAGE="Usage: $PROGNAME [-v|--verbose] [-n|--dry-run] [-b|--batch] [dirs]" DASH_PRINT= ECHO= TEE=cat BATCH= dup2() { # xargs -r -0 -n 1 perl -e 'exit unless ($a=shift);print STDERR "$a\n";print "$a\0"' # xargs -r -0 -n 100 perl -e 'foreach(@ARGV){print STDERR "$_\n";print "$_\0"}' perl -e '$/="\0";while(<>){chomp();print STDERR "$_\n";print "$_\0"}' } while [ -n "$1" ]; do case "$1" in -h|--help) echo "$USAGE" >&2 ; exit 0 ;; -v|--verbose) DASH_PRINT="-print" ; TEE=dup2 ;; -n|--dry-run) ECHO="echo" ;; -b|--batch) BATCH="true" ;; --) shift ; break ;; -*) echo "Invalid flag: $1" >&2 ; echo "$USAGE" >&2 ; exit 2 ;; *) break ;; esac shift done DIRS="${@:-.}" #EXEEXT="sh exe bat com dll" EXEEXT="exe bat com dll" EXTFILTER="$(echo "$EXEEXT" | perl -pe 's/(\w+)/-name \\*.$1 -o/g')" #DBGPRG='-exec echo CAUGHT ".(++$i)." {} \\;' EXEPAT='^#! */^: *Use */eval.*exec' #PATPRG='-exec perl -ne \"BEGIN{\\\$s=1};\\\$.=1&&/$p/&&exit(\\\$s=0);exit(\\\$s);END{exit(\\\$s)}\" {} \\;'; PATPRG='-exec awk \"BEGIN{S=1}NR=1&&/$p/{S=0;exit(0)}{exit(S)}END{exit(S)}\" {} \\;'; PATFILTER="$(echo "$EXEPAT" | perl -pe 's/\n$//;@p=split(//);foreach $p(@p){$p=~s@(['"'"'"/])@\\\\$1@g;$p="'"$PATPRG $DBGPRG"' -o";};$_=join(" ",@p)')" eval "set -- $EXTFILTER $PATFILTER" for DIR in $DIRS; do if [ -d "$DIR" -o -h "$DIR" ]; then FILTER="-type f" elif [ -f "$DIR" ]; then FILTER="-maxdepth 1" fi if [ -z "$BATCH" ]; then find "$DIR" $FILTER -perm -0100 \( "$@" \( $DASH_PRINT -exec $ECHO chmod a-x {} \; \) \) else find "$DIR" $FILTER -perm -0100 \( "$@" -print0 \) | $TEE | xargs -r -0 -n 1000 $ECHO chmod a-x -- fi done