_cdup() { local dir=$1; shift local targets=("$@") for target in $targets; do if [[ -e $dir/$target ]]; then cd $dir return 0 fi done if [[ $dir == "/" ]]; then return 1 else _cdup ${dir:h} ${targets[@]} fi } cdup() { if [[ ${#@} -gt 0 ]]; then _cdup ${PWD:h} "$@" else _cdup ${PWD:h} .git .hg package.json build.sbt fi }