Linux 下如何高效回退到特定层级目录?
1. up 脚本的安装
这个脚本是第三方人员开发的,所以需要我们人为安装到我们的系统。
步骤如下:
###1.1 在 ~/.config/up/
目录下新建一个 up.sh
,内容如下:
#!/usr/bin/env sh
# up.sh: Quickly traverse up the current working path.
# Author: Shannon Moeller <me@shannonmoeller.com>
# Source to use: [ -f /path/to/up.sh ] && . /path/to/up.sh
__updir() {
if [[ "$1" == "/" || -z "$1" || -z "$2" ]]; then
return
fi
local p="$(dirname "$1")"
local a="$(basename "$p")"
local b="$(basename "$2")"
if [[ -z "$a" || -z "$b" ]]; then
return
fi
if [[ "$a" == "$b"* ]]; then
echo "$p"
return
fi
__updir "$p" "$2"
}
__upnum() {
if [[ -z "$1" || -z "$2" || ! "$2" =~ ^[0-9]+$ ]]; then
return
fi
local p="$1"
local i="$2"
while (( i-- )); do
p="$(dirname "$p")"
done
echo "$p"
}
_up() {
local p="$(dirname $PWD)"
local w="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(IFS=';' compgen -S/ -W "${p//\//;}" -- "$w") )
}
up() {
# up one
if (( ! $# )); then
cd ..
return
fi
# up dir
local d="$(__updir "$PWD" "$1")"
if [[ -d "$d" ]]; then
cd "$d"
return
fi
# up num
local n="$(__upnum "$PWD" "$1")"
if [[ -d "$n" ]]; then
cd "$n"
return
fi
# fallback
if [[ $1 == - || -d $1 ]]; then
cd $1
return
fi
# usage
echo -e "usage: up [dir|num|-]\npwd: $PWD"
}
# zsh compatibility
if [[ -n ${ZSH_VERSION-} ]]; then
autoload -U +X bashcompinit && bashcompinit
fi
# tab-completion
complete -o nospace -F _up up
2.2 添加进启动脚本
echo ''source ~/.config/up/up.sh'' >> ~/.bashrc
3.3 使改动生效
source ~/.bashrc
2. up 脚本的使用
按照以上步骤操作,我们就能将 up 脚本安装到系统并完成配置。接下来我们就可以用它来尽情地玩耍了。
首先,我们先明确自己所处的路径:
$ pwd
/home/alvin/projects/atb4g/ecall/src/interface
如果我们只想回到上级目录,只需执行 up
即可。
$ up
$ pwd
/home/alvin/projects/atb4g/ecall/src
那如果我想回退到更高层级的目录呢?我现在是在 src 目录,如果我想回退到 projects 目录,要怎么操作?
我们只需要 up 命令后跟上你要跳转的层级数,不加的话就默认是 1 。在这个例子里,我们要回退 3 层目录,即:
$ up 3
$ pwd
/home/alvin/projects
前面已经提到,我们可以直接回退到某一个指定的目录名下。比如我现在还是在 src 目录,想要回退到 projects 目录,我们可以这样操作:
$ pwd
/home/alvin/projects/atb4g/ecall/src
$ up projects
$ pwd
/home/alvin/projects
如果要回退的单词长度太长写得太累怎么办?你只需指明这个目录的前几个字母, up 脚本就会识别并跳转。
$ pwd
/home/alvin/projects/atb4g/ecall/src
$ up pr # 这里只指定了前两个字母
$ pwd
/home/alvin/projects
同时,它也支持 tab 键:
$ pwd
/home/alvin/projects/atb4g/ecall/src
$ up # 敲 tab 键
ecall/ atb4g/ projects/ alvin/ home/