function cd_history () { if [ -z "$1" ] then \cd "$HOME" return fi old=$( tail -n 149 "$HOME/.bash_cdhistory" ) echo "$old" > "$HOME/.bash_cdhistory" \cd "$1" p=$( pwd ) b=$( basename "$p" ) echo $b":"$p >> "$HOME/.bash_cdhistory" } alias cd=cd_history function qcd() { while getopts alhm opt do case "$opt" in a) # Adding name=${!OPTIND} if [ -z "$name" ] then name=$( basename $( pwd )) fi echo "$name":$( pwd ) echo "$name":$( pwd ) >> ~/.qcd ;; l) echo ==History ~/.bash_cdhistory: cat ~/.bash_cdhistory echo echo ==Saved ~/.qcd: cat ~/.qcd ;; m) IFS=$'\n' for line in $( cat ~/.bash_cdhistory ); do if [ -d "${line/*:/}" ]; then echo "$line" >> ~/.bash_cdhistory.tmp fi done mv ~/.bash_cdhistory.tmp ~/.bash_cdhistory for line in $( cat ~/.qcd ); do if [ -d "${line/*:/}" ]; then echo "$line" >> ~/.qcd.tmp fi done mv ~/.qcd.tmp ~/.qcd ;; h) echo "qcd [-al] [name]" echo "Change current working path based on the list ~/.qcd" echo "Keeps a history of folders visited in ~/.bash_cdhistory" echo " " echo "qcd -a [name]" echo " Adds the path to the list" echo " You may add the name of the path, but when omitted" echo " the basename will be used" echo " " echo "qcd -l " echo " Lists the paths" echo " " echo "qcd -m " echo " Maintain the list files, deleting non-existing entries" ;; esac done unset OPTSTRING unset OPTIND if [ -z "$1" ] then \cd else d=$( grep -h ^"$1" ~/.qcd <( tac ~/.bash_cdhistory ) | head -n 1 ) d=${d/*:/} if [ ! -z "$d" ] then \cd "$d" fi fi } function whenfilechanges() { [ -z "$1" ] && { echo 'Usage: whenfilechanges "file" "some" "command" Follows the modification time of the "file" and runs the command at every change. ' return } [ -e "$1" ] || { echo $1 not found return } fname=$1 shift 1 otime=$( stat -c %Z "$fname" ) while : do ntime=$( stat -c %Z "$fname" ) [ "$ntime" -ne "$otime" ] && { eval "$@" otime=$( stat -c %Z "$fname" ) } sleep 2 done }