Linux 情景 linux--如何摆脱深路径的频繁切换烦恼?

stack · 2017年04月20日 · 最后由 陈恒捷 回复于 2017年04月23日 · 3557 次阅读

情景

通常情况下,在 linux 系统上切换目录的成本很低,使用 cd 命令就可以了。如果需要在一个目录的不同的子目录和其父目录之间切换,进入到这个目录之后,再使用相对路径会比较方便。如果要切换的目录的路径较浅,那使用绝对路径也未尝不可。

但是,如果需要频繁在两个以上的深路径的目录里切换,无论使用相对路径还是绝对路径,切换目录都会比较耗时,严重影响你工作的效率。

有没有什么好方法呢?

方案

为了方便举例,我们在当前用户的根目录下创建一个目录dir_test,然后进入到该目录下。

$ pwd
/home/j-tester/dir_test

再在这个目录下创建几个路径较深的目录:

$ mkdir -p 1/11/111/1111/11111 2/22/222/2222/22222 3/33/333/3333/33333 4/44/444/4444/44444

为了方便演示和说明,故意将每个目录的名称都设置为数字,且根据层次依次增加数字的位数。实际情景下遇到的长路径无论是目录名称的长度还是每层目录下的子目录数量都比本例要复杂得多的。

查看一下这些个目录:

$ ls -l */*/*/*/*
1/11/111/1111/11111:
总用量 0

2/22/222/2222/22222:
总用量 0

3/33/333/3333/33333:
总用量 0

4/44/444/4444/44444:
总用量 0

两个目录

如果只需要在两个目录之间切换,无论目录的路径长短,使用cd -(切换到上一个目录)应该是最高效的。

比如,只需要在1111133333两个目录之间切换:

先进入11111目录,再进入33333目录,此时执行cd -就进入了11111目录。再执行cd -就又回到了33333目录,如此反复。并且cd -执行后会输出当前所在的目录。

$ cd /home/j-tester/dir_test/1/11/111/1111/11111
$ pwd
/home/j-tester/dir_test/1/11/111/1111/11111
$ cd /home/j-tester/dir_test/3/33/333/3333/33333
$ pwd
/home/j-tester/dir_test/3/33/333/3333/33333
$ cd -
~/dir_test/1/11/111/1111/11111
$ cd -
~/dir_test/3/33/333/3333/33333
$ cd -
~/dir_test/1/11/111/1111/11111

是不是很方便?但务必注意,它只能记住上一个目录是什么,所以如果在两个目录之间切换它刚好适用。当需要在更多的目录里切换时,它就 Hold 不住了。

软链接

linux 系统下可以创建软链接,相当于 windows 下的快捷方式。

使用软链接的方式可以从一定程度上降低切换目录的成本,但也有着明显的缺点:

  1. 如果实现 n 个目录的自由切换,需要创建 n*(n-1) 个软链接,这样看来,似乎仅当 n=2 时工作量还可以接受;
  2. 切换别的目录时,还需要重新创建软链接;
  3. 创建软链接毕竟需要对目录内容进行了改变,这往往不是预期的效果;

所以,介绍软链接用于切换目录只是提供一种思路而已。

目录栈命令

但凡是切换目录的场景,目录栈命令都 hold 住

目录栈命令共有三个:pushd、popd、dirs。

要想熟练使用这三个命令,首先要理解什么是目录栈。

目录栈

目录栈是用户最近访问过的系统目录的列表(和环境变量 DIRSTACK 内容相对应),并以堆栈的形式管理,列表中的每一项都是绝对路径

dirs

dirs 命令的结果显示当前目录栈中的所有记录。默认情况下的目录栈是当前目录。

dirs
~
cd dir_test
dirs
~/dir_test ~

进入到dir_test目录后执行dirs,结果首先是当前目录,其次是进入dir_test之前的目录栈内容。这说明了,cd dir_test的操作是除了进入目录之外,还将dir_test这个目录加入到了目录栈中。目录栈的最左端是栈顶,最右端是栈底。

用法:

dirs [+N] [-N] [-cplv]

参数说明:

+N   将第N个目录显示出来(从左边栈顶数起,数字从0开始)
-N   将第N个目录显示出来(从右边栈底数起,数字从0开始)
-c   删除目录栈中的所有记录
-l   以完整格式显示(默认情况下当前用户的根路径用~表示)
-p   每行一个目录来显示目录栈的内容
-v   每行一个目录来显示目录栈的内容,每个目录前加上的编号,从0开始

pushd

pushd 的作用是将目录加入到目录栈的顶部,并切换到该目录。

不带参数执行时,效果是互换目录栈顶部的前两个目录的位置,也就实现了在栈顶的最上面两个目录之间切换。

用法:

pushd [-n] [+N] [-N]
pushd [-n] [dir]

参数说明:

-n   将目录入栈时,不切换目录
+N   将第N个目录移至栈顶(从左边栈顶数起,数字从0开始)
-N   将第N个目录移至栈顶(从右边栈底数起,数字从0开始)

popd

popd 的用途是删除目录栈中的记录。
不带参数执行时将删除目录栈顶部的目录,然后切换到新的栈顶元素所指向的目录。
用法:

popd [-n] [+N] [-N]

参数说明:

+N   将第N个目录删除(从左边栈顶数起,数字从0开始)
-N   将第N个目录删除(从右边栈底数起,数字从0开始)
-n   将目录出栈时,不切换目录

三个命令都有 +N 和-N 的参数,且规则一致,为了避免混淆,记住一个方向即可:

自顶(栈顶、左边)向下(栈底、右边)是正道(正号、+N)

创建别名

实际使用时还可以为 pushd 和 popd 设置别名,比如:

alias p1="pushd +1"
alias p2="pushd +2"
alias pp1="popd +1"
alias pp2="popd +2"

可根据自己的实际需求定制。

目录栈命令用起来非常灵活,也非常便利。

扩展知识

  1. 快捷目录-
  2. 软链接
  3. 目录栈及命令
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 13 条回复 时间 点赞

autojump 很方便,关键字,短链接。lz 可以试试看。

我比较困惑 terminal 下面的光标移动。如何快速移动。

stack #11 · 2017年04月20日 Author
恒温 回复

可否具体些?没有明白你的意思。

stack #10 · 2017年04月20日 Author
jizu 回复

刚才在 centos 上用 yum 安装了 autojump 和 autojump-zsh,不能使用。从 git 库上下载下来后安装可以使用。不过还不得其要领呢。😥
git 地址:

https://github.com/wting/autojump
stack 回复

就是移动,比如 ctr+a。ctrl e

stack 回复

多用下就习惯了。我也没用很多,就是简单的跳转,j + 印象目录名称

恒温 回复

哦哦,这块我平时基本只用ctrl-w(删除光标前的一个单词)和ctrl-u(删除光标前的所有)。
不过刚才了解了下,发现这部分包含了不少不错的内容,稍后整理篇文章出来。

stack 回复

👍 我比较头疼的是 如何在中间快速跳。 比如 adb shell input text xxxxx 我想让光标跳到 input 的地方。

恒温 回复

命令的执行环境是 windows 还是 linux?
如果是 windows,没有什么好办法。
如果是 linux,可以用set -o vi把命令行设置成 vi 风格的,这样在命令行上按下esc后就可以按 Vi 的风格操作命令行了。这种方法我用的很少,没有相关经验,只能你自己趟坑了。

stack 回复

mac 上倒是有一套 mapping

我的目录栈中为什么始终只有一个路径?是要怎么写进去吗?dirs -v 只展示了一个 0 ~ 我切到每一个路径下都是这样

刘晋芳 回复

切换目录时使用pushd 目录,然后再用 dirs 查看,看是否变化了?

恒温 回复

可以看下 http://www.techrepublic.com/article/keyboard-shortcuts-in-bash-and-zsh/

试了下,在 mac 命令行 (zsh 或 bash) 下,alt + 方向左键 可以做到按空格来跳光标,即每次都是跳到一个空格符的后一个字符,ssh 连接了远程机器后这种方法也是生效的。

不过不确定 windows 下是否也同样适用。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册