#!/bin/bash # $HeadURL: https://svn.pasta.freemyip.com/main/ade/tags/3.0.3/share/templates/loc/bin/loc $ $LastChangedRevision: 11136 $ # Modules . $(miniade) || { echo "${0##*/}: ERROR: miniade failed (hint: run 'miniade' to see error)" >&2; exit 1; } # Configurable stuff # Other globals # The next line is extracted by 'adegmt -l'. After adegmt has been used to get this template the line can be removed. # ADEGMT-LIST-HINT: MINIADE-based bash script implementing lx(1) main() { local MY_ARGS UPDATE_CACHE_FLAG PROGNAME FILTER_IN_REGEXP FILTER_OUT_REGEXP ARG # Defaults for options UPDATE_CACHE_FLAG=false OPT_FILTER_OUT_REGEXP= MAX_DB_AGE=$((3600 * 24 * 7)) # Process options special_opts_handler() { case $1 in --update) UPDATE_CACHE_FLAG=true ;; --no-filter) OPT_FILTER_OUT_REGEXP="THIS_WONT_MATCH_ANYTHING" ;; *) return 1 ;; esac } miniade_process_options --help-handler=help --special-opts-handler=special_opts_handler MY_ARGS "$@" && set -- "${MY_ARGS[@]}" # Process arguments [ $# -ge 1 ] || miniade_bad_usage FILTER_IN_REGEXP="" for ARG in "$@"; do FILTER_IN_REGEXP+="(?=.*$ARG)" done # Sanity checks and derivations miniade_get_progname PROGNAME # There's no nice way to determine the .config dir. Stephen Kitt on # https://unix.stackexchange.com/questions/726717 suggests to use # ${XDG_CONFIG_HOME:-$HOME/.config}. CONFIG_DIR=${XDG_CONFIG_HOME:-$HOME/.config}/$PROGNAME CONFIG_DIR=$(echo "$CONFIG_DIR" | sed "s@^~/@$HOME/@") CONFIG_FILE=$CONFIG_DIR/settings CACHE_DIR=${XDG_CACHE_HOME:-$HOME/.cache}/$PROGNAME CACHE_DIR=$(echo "$CACHE_DIR" | sed "s@^~/@$HOME/@") CACHE_FILE=$CACHE_DIR/find.out if [ ! -f $CONFIG_FILE ]; then miniade_warning "$CONFIG_FILE: not found; generating from template ..." mkdir -p $CONFIG_DIR { echo "#FILTER_OUT_REGEXP=\"/(not_this_dir|or_this_dir|or_this_other_dir)/\"" echo "#MAX_DB_AGE=$((3600 * 24 * 7)) # one week" } > $CONFIG_FILE fi [ "X$(bash -c ". $CONFIG_FILE 2>/dev/null && echo OK")" = XOK ] || miniade_error "$CONFIG_FILE: not loadable" . $CONFIG_FILE if $UPDATE_CACHE_FLAG; then : elif [ ! -f $CACHE_FILE ]; then miniade_warning "cache missing" UPDATE_CACHE_FLAG=true elif (( $(date +%s)-$(stat -c %Y $CACHE_FILE) > $MAX_DB_AGE )); then miniade_warning "cache old" UPDATE_CACHE_FLAG=true fi umask 077 if [ "X$OPT_FILTER_OUT_REGEXP" != X ]; then FILTER_OUT_REGEXP="$OPT_FILTER_OUT_REGEXP" elif [ "X$FILTER_OUT_REGEXP" = X ]; then FILTER_OUT_REGEXP=THIS_WONT_MATCH_ANYTHING fi # Guts mkdir -p $CACHE_DIR if $UPDATE_CACHE_FLAG; then miniade_info "updating cache ..." miniade_evaler "find ~/ -type f -print | sed \"s@^\$HOME/@@\" | sort > /tmp/$PROGNAME.$$.find" miniade_evaler "mv /tmp/$PROGNAME.$$.find $CACHE_FILE" fi miniade_evaler "grep -P \"$FILTER_IN_REGEXP\" $CACHE_FILE | egrep -v \"$FILTER_OUT_REGEXP\"" } help() { local PROGNAME miniade_get_progname PROGNAME echo "Usage: $PROGNAME [ ] [ --update ] [ --no-filter ] [ ... ]" exit 0 } main "$@"