#!/bin/ksh # /bin/ls -aR /foo | ls-R2find -d - = find /foo -type d # /bin/ls -aR /foo | ls-R2find -f - = find /foo \(-type f -o -type l\) # /bin/ls -aR /foo | ls-R2find -d - -f - = find /foo # # Please note two types of output from "ls -aR": # # mkdir a; touch a/b # mkdir a/c # /bin/ls -aR a # a: # . .. b c # # a/c: # . .. # /usr/local/bin/ls -aR a # . .. b c # # a/c: # . .. PATH=/bin b=$(basename $0) trap "rm -f /tmp/.$b.$$.d /tmp/.$b.$$.a; exit" 1 2 15 exit > /tmp/.$b.$$.d > /tmp/.$b.$$.a FOPT=0 DOPT=0 while getopts :f:d: c do case $c in f) FOPT=1; FFILE=$OPTARG;; d) DOPT=1; DFILE=$OPTARG;; ?) echo "Usage: $0 [-d|-f] [file]"; exit 1;; esac done shift $(($OPTIND - 1)) t= if [[ -n "$*" ]]; then cat $* else cat fi | sed "/^total [0-9]*$/d; s:^.* ::; /^\.\{1,2\}$/d" \ | while read i do if [[ "$i" = *: ]]; then [[ -z "$t" ]] && t=a d=${i%:} echo $d >> /tmp/.$b.$$.d elif [[ "$i" = "" ]]; then : else [[ -z "$t" ]] && t=b if [[ $FOPT = 1 ]]; then if [[ -n "$d" ]]; then echo $d/$i else echo ./$i fi >> /tmp/.$b.$$.a fi fi done if [[ "$t" = "b" ]]; then if [[ -s /tmp/.$b.$$.d ]]; then d=$(head -1 /tmp/.$b.$$.d) dd=${d%/*} if [[ "$dd" != "$d" ]] ; then echo "$dd" >> /tmp/.$b.$$.d f=$(sed "s:^\./:$dd/:" /tmp/.$b.$$.a) else echo "." >> /tmp/.$b.$$.d f=$(sed "s:^\./::" /tmp/.$b.$$.a) fi echo "$f" > /tmp/.$b.$$.a fi fi sort -u -o /tmp/.$b.$$.d /tmp/.$b.$$.d sort -u -o /tmp/.$b.$$.a /tmp/.$b.$$.a if [[ $DOPT = 1 ]]; then if [[ $DFILE = "-" ]]; then cat /tmp/.$b.$$.d else ln /tmp/.$b.$$.d $DFILE fi fi if [[ $FOPT = 1 ]]; then comm -13 /tmp/.$b.$$.d /tmp/.$b.$$.a | if [[ $FFILE = "-" ]]; then [[ $DFILE = "-" ]] && echo cat else cat > $FFILE fi fi