Need to simplify a script that makes cool trees
Kristian Vaaf
vaaf at broadpark.no
Sat Jan 7 10:45:25 PST 2006
Here's the latest addition.
Just to give you an idea of what simplicity I'm aiming towards.
Still doesn't work though.
#!/bin/sh
#
# Read a directory or file list, then write a tree.
# $URBAN: fs-tree.sh,v 1.0 2005/10/24 15:05:09 vaaf Exp $
#
# Print files in addition to directories: -a
#
tree=`sed -e 's,^.$,,' \
-e '/^$/d' \
-e 's,[^/]*/\([^/]*\)$,+-----\1,' \
-e 's,[^/]*/,| ,g'`
cd $1
all="-type d"
while [ $# -gt 0 ]; do
case $1 in -a) all="" ;; esac; shift;
done
find . $all -print | tr '/' '\001' | sort -f | tr '\001' '/' | "$tree"
----- Original Message -----
From: Kristian Vaaf <vaaf at broadpark.no>
Date: Saturday, January 7, 2006 7:14 pm
Subject: Need to simplify a script that makes cool trees
>
> Hello!
>
> This script produces a real sweet file and directory tree.
>
> I am trying to simplify this -- it is too big for its own good.
>
> I must remove all the bullshit but the -a switch.
>
> And I'm sure the same thing could be accomplished in just a few lines.
>
> Here is what it does:
>
> # fs-tree
> #
> /usr/home/vaaf/mp3/out
> +-----benny_benassi-whos_your_daddy-promo-cdm-2005-nbd
> +-----bugz_in_the_attic-booty_la_la-mystery_and_matt_early_remix-
> vinyl-2005-mtc
> +-----chris_cox-live_from_park_pavilion_atlanta-sat-01-01-2006-hsalive
>
> # fs-tree -a
> #
> /usr/home/vaaf/mp3/out
> +-----benny_benassi-whos_your_daddy-promo-cdm-2005-nbd
> | +-----00-benny_benassi-whos_your_daddy-promo-cdm-2005-nbd.m3u
> | +-----00-benny_benassi-whos_your_daddy-promo-cdm-2005-nbd.nfo
> | +-----00-benny_benassi-whos_your_daddy-promo-cdm-2005-nbd.sfv
>
> And so forth.
>
> Here is the original script:
>
> #!/bin/sh
> #
> # Read a directory or file list,then write a tree.
> # $URBAN: fs-tree.sh,v 1.0 2005/10/24 15:05:09 vaaf Exp $
> #
> # -a, --all Prints all files, not just directories.
> # -h, --help Prints usage information.
> # -l, --list Reads a list of files from stdin.
> # -v, --version Print the version and exit.
> #
>
> PATH=/bin:/usr/sbin:/usr/bin:/usr/local/bin
>
> export PATH
> umask 022
>
> tag=`basename $0`
>
> # *** Functions
> #
> # die: prints an optional argument to stderr and exits.
> # warn: prints an optional argument to stderr.
> #
> # A common use for "die" is with a test:
> #
> # test -f /etc/passwd || die "No password file."
> #
> # This works in subshells and loops,
> # but may not exit with a code other than 0.
> #
> die () {
>
> echo "$tag: Error: $*" 1>&2
> exit 1
>
> }
>
> # *** Usage
> #
> # Prints an optional string plus part of the comment header
> # (if any) to stderr, and exits with code 1.
> #
> usage () {
>
> lines=`egrep -n '^# (NAME|AUTHOR)' $0 | sed -e 's/:.*//'`
>
> (
>
> case "$#"
>
> in
> 0) ;;
> *) echo "Usage error: $*"; echo ;;
> esac
>
> case "$lines"
>
> in
> "") ;;
> *) set `echo $lines | sed -e 's/ /,/'`
> sed -n ${1}p $0 | sed -e 's/^#//g' |
> egrep -v AUTHOR:
> ;;
>
> esac ) 1>&2
>
> exit 1
>
> }
>
> # *** Version
> #
> # Prints the current version to stdout.
> #
> version () {
>
> lsedscr='s/RCSfile: //
> s/.Date: //
> s/,v . .Revision: / v/
> s/\$//g'
>
> lrevno='$RCSfile: fs-tree.sh,v $ $Revision: 1.0 $'
> lrevdate='$Date: 2005/09/09 01:17:30 $'
> echo "$lrevno $lrevdate" | sed -e "$lsedscr"
> exit 0
>
> }
>
> # *** mktree
> #
> # Sort the file information properly.
> #
> mktree () {
>
> scr='
> s,^.$,,
> /^$/d
> s,[^/]*/\([^/]*\)$,+-----\1,
> s,[^/]*/,| ,g'
>
> tr '/' '\001' | sort -f | tr '\001' '/' | sed -e "$scr"
>
> }
>
> # *** Main program defaults
> #
> ac_help=
> ac_prev=
> ac_invalid="Invalid option; use --help to show usage"
> argv=
>
> # *** Initialize some variables set by options.
> #
> all=no
> list=no
> fopt="-type d"
>
> for ac_option; do
>
> # *** If the previous option needs an argument, assign it.
> #
> case "$ac_prev" in
>
> "") ;;
> *) eval "$ac_prev=\$ac_option"; ac_prev=; continue ;;
>
> esac
>
> case "$ac_option" in
>
> -*=*) ac_optarg=`echo "$ac_option" |
> sed 's/[-_a-zA-Z0-9]*=//'` ;;
> *) ac_optarg= ;;
>
> esac
>
> # *** Main switch
> #
> case "$ac_option" in
>
> -a | -all | --all | --al | --a)
> all=yes; fopt="" ;;
>
> -h | -help | --help | --hel | --he)
> usage ;;
>
> -l | -list | --list | --lis | --li | --l)
> list=yes ;;
>
> -v | -version | --version | --versio | --versi | --vers)
> version ;;
>
> -*) die "$ac_option: $ac_invalid" ;;
> *) argv="$argv $ac_option" ;;
>
> esac
>
> done
>
> case "$ac_prev" in
>
> "") ;;
> *) die "Missing argument to --`echo $ac_prev | sed 's/_/-/g'`" ;;
>
> esac
>
> # *** Real work starts here.
> # Test for specific features.
> #
> case "$argv"
>
> in
>
> "") case "$list" in
> "yes") top="" ;; # Sort reads stdin.
> *) top="." ;;
>
> esac
> ;;
>
> *) top=$argv ;;
>
> esac
>
> # *** Print the directory tree.
> #
> case "$list"
>
> in
>
> "no") test -d $top || die "$top: not a directory"
> cd $top; pwd; find . $fopt -print | mktree ;;
>
> "yes") mktree < $top ;;
>
> esac
>
> exit 0
>
> --
>
> And here is my attempt to simplify it.
> Now, mind you that this doesn't even work!
>
> #!/bin/sh
> #
> # Read a directory or file list, then write a tree.
> # $URBAN: fs-tree.sh,v 1.0 2005/10/24 15:05:09 vaaf Exp $
> #
> # Print files in addition to directories: -a
> #
>
> tree() {
>
> do=`tr '/' '\001' | sort -f | tr '\001' '/' |
>
> sed -e 's,^.$,,' \
> -e '/^$/d' \
> -e 's,[^/]*/\([^/]*\)$,+-----\1,' \
> -e 's,[^/]*/,| ,g'`
>
> }
>
> all="-type d"
>
> while [ $# -gt 0 ]; do
>
> case $1 in
>
> -a) all="" ;;
>
> esac
>
> shift
>
> done
>
> find . $dir $all | tree
>
> --
>
> I'm the biggest rookie you've ever seen.
> But I'm thinking this still looks too advanced for its purpose.
>
> Any suggestions?
>
> Thanks!
>
> _______________________________________________
> freebsd-questions at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to "freebsd-questions-
> unsubscribe at freebsd.org"
More information about the freebsd-questions
mailing list