Path: utzoo!utgpu!cs.utexas.edu!uunet!fub!opal!unido!horga!attron!chris From: chris@attron.ruhr.sub.org (Christian Schlichtherle) Newsgroups: alt.sources Subject: list - prints documented listings Keywords: list Message-ID: <506@attron.ruhr.sub.org> Date: 27 Jan 91 17:38:54 GMT Organization: Fa. Schlichtherle Industriebedarf, 5802 Wetter, FRG Lines: 275 This is a shell script. It prints a documented listing on it's standard output. The original idea to write this was to have a better documented UUCP file list (/usr/spool/uucppublic/files). I was unlucky with the output of ls(C), because it gives no information about the contents of the files. So I wrote this. Of course, it works on every directory. Chris #!/bin/sh # This is a shell archive (shar 3.24) # made 01/27/1991 17:30 UTC by chris@attron.ruhr.sub.org # Source directory /u/chris/src/list # # existing files WILL be overwritten # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 202 -rw-r--r-- .list # 476 -r--r--r-- Makefile # 1775 -r--r--r-- README # 1581 -r--r--r-- list.sh # if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= .list ============== echo "x - extracting .list (Text)" sed 's/^X//' << 'SHAR_EOF' > .list && X.list Demonstration file for list(C) XMakefile Makefile for list(C) XREADME Documentation file for list(C) Xlist.sh Prints documented listing Xtestline This line will vanish when executing 'list -u' ;-) SHAR_EOF $TOUCH -am 0127181391 .list && chmod 0644 .list || echo "restore of .list failed" set `wc -c .list`;Wc_c=$1 if test "$Wc_c" != "202"; then echo original size 202, current size $Wc_c fi # ============= Makefile ============== echo "x - extracting Makefile (Text)" sed 's/^X//' << 'SHAR_EOF' > Makefile && X# X# @(#) Makefile 1.1 91/01/27 X# X# Written 1991 by Christian Schlichtherle X# (chris@attron.ruhr.sub.org) X# No copyright until you remove this header. The author X# disclaims any warranty. X# X# Makefile - Makefile for list(C). X# X XOWNER=chris XGROUP=freak XMODE=0755 XBIN=/u/bin X Xlist: list.sh X cp $? $@ X chmod $(MODE) $@ X Xinstall: $(BIN)/list X X$(BIN)/list: list X cp $? $@ X chown $(OWNER) $@ X chgrp $(GROUP) $@ X chmod $(MODE) $@ X Xuninstall: X rm -f $(BIN)/list X Xclean: X rm -f list SHAR_EOF $TOUCH -am 0127182891 Makefile && chmod 0444 Makefile || echo "restore of Makefile failed" set `wc -c Makefile`;Wc_c=$1 if test "$Wc_c" != "476"; then echo original size 476, current size $Wc_c fi # ============= README ============== echo "x - extracting README (Text)" sed 's/^X//' << 'SHAR_EOF' > README && X X @(#) README 1.1 91/01/27 X X Written 1991 by Christian Schlichtherle X (chris@attron.ruhr.sub.org) X No copyright unless you remove this header. The author X disclaims any warranty. X X README - Documentation file for list(C). X XNAME X X list - Prints documented listings. X XSYNTAX X X list [-A] [ ...] X list -u [ ...] X XDESCRIPTION X X list(C) prints a documented listing on standard output. The X output is formated. The first field contains the filename, X the second field the size of the file in bytes. The rest of X the line contains the description for the file. The lines X are sorted in increasing ASCII collating sequence (like X ls(C)). The "-A" option indicates that files beginning with X a period are listed for non-super users too (like ls(C)). X X The description for the files is held in the file ".list" X in the directory where the file reside. This file is X formatted as follows: The first field contains the filename X and the rest of the line contains the description for the X file. The lines are sorted in increasing ASCII collating X sequence. X X The second form of the command 'list -u [ ...]' X updates the ".list" file. The lines are sorted, descriptions X for nonexistent files are thrown away and the output is X formatted. X XFILES X X .list Description file for listing X XSEE ALSO X X ls(C), sort(C), join(C), awk(C) X XNOTES X X Whitespace in the description field of the ".list" file is X replaced by a single space character. X X Filenames must not contain escape sequences for printf(). X X If your awk bails out you will have to substitute the line X "print substr($0, i + 2);" with "print substr($0, i + 2, X 255);" or "print substr($0, i + 2, length($1) - i - 1);". I X used this because it shows better performance (need not X process length($1)). SHAR_EOF $TOUCH -am 0127182891 README && chmod 0444 README || echo "restore of README failed" set `wc -c README`;Wc_c=$1 if test "$Wc_c" != "1775"; then echo original size 1775, current size $Wc_c fi # ============= list.sh ============== echo "x - extracting list.sh (Text)" sed 's/^X//' << 'SHAR_EOF' > list.sh && X: X# X# @(#) list.sh 1.1 91/01/27 X# X# Written 1991 by Christian Schlichtherle X# (chris@attron.ruhr.sub.org) X# No copyright unless you remove this header. The author X# disclaims any warranty. X# X# list.sh - Bourne shell script for list(C). X# X XPATH=/bin:/usr/bin XLISTFILE=.list XTMP=/tmp/upd$$ XUSAGE="usage:\t$0 [-A] [ ...]\n\t$0 -u [ ...]" X Xset -h X Xusage() { X echo $USAGE 1>&2 X exit 1 X} X Xlist() { X if [ $# -gt 1 ] X then X ECHO=ECHO X else X ECHO=: X fi X for FILE in $@ X do X if [ -d $FILE ] X then X $ECHO "\n$FILE:" X LISTPATH=$FILE/$LISTFILE X else X LISTPATH=`dirname $FILE`/$LISTFILE X fi X if [ -r $LISTPATH ] X then X ls -n $LISTOPT $FILE | join -a1 -j1 9 - $LISTPATH | \ X awk 'NF >= 9 { X printf "%-14s %7s", $1, $6; X if (NF > 9) X for (i = 10; i <= NF; i++) X printf " %s", $i; X printf "\n"; X } ' - X else X ls -n $FILE | awk '{ printf "%-14s %7s\n", $9, $5; }' - X fi X done X} X Xupdate() { X for FILE in $@ X do X [ ! -d $FILE ] && { X echo Not a directory: $FILE X continue X } X trap : 1 2 3 13 15 # save the listfile X sort $FILE/$LISTFILE > $TMP && X ls -A $FILE | join - $TMP | \ X awk ' { X printf $1; X if ((i = length($1)) < 8) X printf "\t\t"; X else X printf "\t"; X print substr($0, i + 2); X } ' - > $FILE/$LISTFILE X rm -f $TMP X trap '' 1 2 3 13 15 X done X} X XMODE=list Xfor i in $@ Xdo X case $i in X -A) [ $MODE = update ] && usage X LISTOPT="$LISTOPT -A" X ;; X -u) [ "$LISTOPT" ] && usage X MODE=update X ;; X -*) usage X ;; X *) break X ;; X esac X shift Xdone X Xset -- ${@:-.} X$MODE $* SHAR_EOF $TOUCH -am 0127182891 list.sh && chmod 0444 list.sh || echo "restore of list.sh failed" set `wc -c list.sh`;Wc_c=$1 if test "$Wc_c" != "1581"; then echo original size 1581, current size $Wc_c fi exit 0 -- Snail: Christian Schlichtherle, Elbscheweg 20, 5802 Wetter 4, Germany Email: chris@attron.ruhr.sub.org Tel.: +49 2335 7550 Politiker an die Front!