utils/bash/sources/41_pivot-command

107 lines
2.0 KiB
Plaintext
Raw Normal View History

2015-01-14 02:40:58 +00:00
#!/bin/bash
# Pivot: The handy diretory switch
# Examples:
# /root/a/b/c/d $ swing a k
# /root/k/b/c/d $ swing k g
# /root/g/b/c/d $ swing b f
# /root/g/f/c/d $
function pvt() {
ARG1=$1; ARG2=$2; ARG3=$3;
if [[ -z "$ARG1" ]]; then
__func_head "[MODE] PIVOT_DIR LAND_DIR"
echo
return 1
fi
case "$ARG1" in
p)
CC='pushd' ;;
c)
CC='cd' ;;
e)
CC='echo' ;;
*)
CC='cd'
ARG3=$ARG2
ARG2=$ARG1
;;
esac
2015-01-14 02:45:04 +00:00
if [[ -z "$ARG3" ]]; then
>&2 echo "Error: LAND_DIR is not defined"
pvt
return 1
fi
2015-01-14 02:40:58 +00:00
IFS="/" read -a PWDA <<< "$(pwd)"
# Begin finding dirs in up-stack
MARK=0
LISTOF=''
UP_STACK=''
for i in "${!PWDA[@]}"
do
DIR=${PWDA[$i]}
if [[ -n "$DIR" ]]; then
LISTOF="$LISTOF\n $DIR";
fi
if [[ "$DIR" =~ $ARG2 ]]; then
MARK=$i
continue
fi
if [[ $MARK -ne 0 ]]; then
UP_STACK="$UP_STACK/$DIR"
fi
done
if [[ $MARK -eq 0 ]]; then
echo "No such token in up stack: $ARG3"
echo -e $LISTOF;
echo
return 1
fi
PARENT_DIR='/'
for (( i=1; i<$MARK; i++ ))
do
PARENT_DIR="$PARENT_DIR${PWDA[$i]}/"
done
CAND=()
for i in $( find $PARENT_DIR -maxdepth 1 -type d -name "*$ARG3*" )
do
CAND+=("$i")
done
for i in "${!CAND[@]}"
do
DIR="${CAND[$i]}"
LAND_DIR="$DIR$UP_STACK"
if [[ -d "$LAND_DIR" ]]; then
$CC "$LAND_DIR"
return 0
fi
done
echo "Error: Cannot land to \"$UP_STACK\" under pivoting parent: \"$PARENT_DIR\""
echo "List of possible landings:"
for i in $( find $PARENT_DIR -maxdepth 1 -type d )
do
LAND_DIR="$i$UP_STACK"
if [[ -d "$LAND_DIR" ]]; then
echo " "$( basename $i )
fi
done
echo
return 1
}