2020-11-03 12:07:49 -08:00
|
|
|
#!/bin/bash
|
|
|
|
source_dir () {
|
|
|
|
# USAGE
|
|
|
|
# will never source source .files or .directories
|
|
|
|
# all option arguments that contain globs/wildcards must be quoted to avoid expansion
|
|
|
|
# p option excludes additional paths below of the given name (and depth)
|
|
|
|
# d option sets the directory depth which is current directy by default, 0 is all
|
|
|
|
# x excludes file globs
|
|
|
|
# f inclucdes only file globs otherwise it's all except .files
|
|
|
|
# if no directory is given it will attempt to source the present working directory
|
|
|
|
# example:
|
|
|
|
# source_dir -p "archive" -x '"*.off" "*.md"' -d 0 # $DIR/$SUBDIR
|
|
|
|
declare OPTION
|
|
|
|
declare OPTARG
|
|
|
|
declare OPTIND
|
|
|
|
local PATHS
|
|
|
|
local NAMES
|
|
|
|
local ENAMES
|
|
|
|
local DEPTH=1
|
|
|
|
local VERBOSE=0
|
|
|
|
|
|
|
|
while getopts 'p:d:x:f:' OPTION; do
|
|
|
|
case "$OPTION" in
|
|
|
|
p)
|
|
|
|
# PATHS=("$OPTARG")
|
|
|
|
IFS=',' read -r -a PATHS <<< "$OPTARG"
|
|
|
|
# echo EXCLUDING THESE PATHS ${PATHS[*]}
|
|
|
|
;;
|
|
|
|
x)
|
|
|
|
IFS=',' read -r -a ENAMES <<< "${OPTARG}"
|
|
|
|
# echo EXCLUDING THESE FILE NAMES ${ENAMES[*]}
|
|
|
|
;;
|
|
|
|
f)
|
|
|
|
# NAMES=("$OPTARG")
|
|
|
|
IFS=',' read -r -a NAMES <<< "${OPTARG}"
|
|
|
|
# echo INCLUDING ONLY THESE FILE NAMES ${NAMES[*]}
|
|
|
|
;;
|
|
|
|
d)
|
|
|
|
DEPTH=$OPTARG
|
|
|
|
# echo "SOURCING TO DEPTH (0=any)" "$DEPTH"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo unknown option $OPTION
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
shift $(( OPTIND - 1 ))
|
|
|
|
|
|
|
|
local DIR
|
|
|
|
DIR="$@"
|
|
|
|
if [ ! "$DIR" ]; then
|
|
|
|
if [ -v PS1 ]; then
|
|
|
|
echo no directory to source provided
|
|
|
|
echo sourcing present working directory $(pwd)
|
|
|
|
read -p "Do you want to continue? " -n 1 -r
|
|
|
|
[[ $REPLY =~ ^[Yy]$ ]] && DIR=$(pwd) || return 1
|
|
|
|
else
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
[ ! -d "$DIR" ] && echo " directory $DIR does not exist, aborting" && return 1
|
|
|
|
|
|
|
|
# echo dir $DIR
|
|
|
|
|
|
|
|
local FIND
|
|
|
|
FIND="find $DIR"
|
|
|
|
FIND+=$([ ! $DEPTH == 0 ] && echo " -maxdepth $DEPTH ")
|
2020-11-10 14:09:08 -08:00
|
|
|
# ignore all .name and .path by default
|
|
|
|
# TODO change to having a string
|
2020-11-03 12:07:49 -08:00
|
|
|
FIND+=" -type f ! -path \"*/.*/*\" ! -name \".*\" "
|
|
|
|
|
|
|
|
|
|
|
|
local name
|
|
|
|
local path
|
|
|
|
|
|
|
|
if [[ ${PATHS[0]} ]]; then
|
|
|
|
for path in ${PATHS[@]}; do
|
|
|
|
# echo excluding $path
|
|
|
|
FIND+=$(echo ' ! -path "*/'$path'/*"')
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ ${ENAMES[0]} ]]; then
|
|
|
|
for name in ${ENAMES[@]}; do
|
|
|
|
# echo excluding name $name
|
|
|
|
FIND+=$(echo " ! -name ${name}")
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ ${NAMES[0]} ]]; then
|
|
|
|
for name in ${NAMES[@]}; do
|
|
|
|
# echo only finding $name
|
|
|
|
FIND+=$(echo " -name ${name}")
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
|
|
|
|
# echo
|
|
|
|
# echo find dir: $DIR
|
|
|
|
# echo find command: $FIND
|
|
|
|
|
|
|
|
local FILES
|
|
|
|
FILES=$(eval $FIND | sort)
|
|
|
|
# echo $FILES | xargs -n 1
|
|
|
|
for f in $FILES; do
|
|
|
|
# echo sourcing: $f
|
|
|
|
. "$f"
|
|
|
|
done
|
|
|
|
|
|
|
|
}
|