Linux 下如何高效回退到特定层级目录?

up脚本的使用

Posted by VK on September 11, 2019

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/