选项
|
含义
|
-p
|
每行显示一条记录
|
-v
|
每行显示一条记录,同时展示该记录在栈中的index
|
-c
|
清空目录栈
|
使用 pushd 和 popd 实现快速切换目录
Posted 云梦谭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 pushd 和 popd 实现快速切换目录相关的知识,希望对你有一定的参考价值。
在Linux下,需要切换路径时,习惯的方案是制并粘贴路径,然后使用 cd命令。但是,如果需要在多个路径间来回切换,这种方法的效率就变得极为低下,时间都耗费在路径的复制粘贴上了。
其实,有个简便快捷的方式。就是利用pushd 和 popd 命令切换目录。一般情况下,Bash和其他shell都支持使用 pushd 和 popd 命令切换目录。 这两个命令会创建一个路径栈,它是一个保存了已访问目录的LIFO列表。
pushd
- 压入并切换路径:
现在栈中包含两个节点:/var/ ~,当前目录为 /var/pushd /var/
- 再压入下一个目录路径
现在栈中包含三个节点:/usr/src /var/ ~,当前目录为/usr/srcpushd /usr/src
- 再压入一个目录路径
pushd /etc/
现在栈中包含四个节点:/etc /usr/src /var/ ~,当前目录为/etc
你可以根据自己的需要压入更多的路径。但是,节点多了,记不住,怎么办?可以用dirs命令 -
查看目录栈里的内容
dirs
或
dirs -v
-
切换路径
当你想切换到栈中任意一个路径时,只需要上面的ID就可以,比如说,切换到~:
pushd +3
注意是切换后,ID也是随着变化的:
-
删除栈中节点
popd
不带参数删除栈顶节点,并自动切换到下一个目录节点中,也可以指定ID,这时会删除ID指定的节点,并切换到ID的后续节点路径下
popd +2
pushd和popd
其实,很早就知道pushd和popd在linux中可以用来方便地在多个目录之间切换。那时比较浮躁,感觉切换目录没必要这么复杂。在实际中,发现通过使用pushd和popd能够极大地提高效率。
0、使用cd -进行目录切换
一般,Shell中都可以通过cd -命令回到之前的目录,下面是一个例子:
$ pwd /home/lfqy $ cd / $ cd - /home/lfqy $
实际上,cd -中,-就相当于变量$OLDPWD。cd -就相当于cd $OLDPWD。下面是一个例子:
$ pwd /home/lfqy $ cd / $ echo $OLDPWD /home/lfqy $ cd $OLDPWD $ pwd /home/lfqy $
1、pushd、popd和dirs
pushd和popd是对一个目录栈进行操作,而dirs是显示目录栈的内容。而目录栈就是一个保存目录的栈结构,该栈结构的顶端永远都存放着当前目录(这里点从下面可以进一步看到)。
1.1 dirs
dirs常用的有两个参数:
下面没有显示地对目录栈进行任何操作,我们来看下当前目录栈的内容是什么:
$ pwd /home/lfqy $ dirs -v 0 ~ $ cd / $ dirs -v 0 / $ dirs -c $ dirs -v 0 / $
可以看出,目录栈中只有一个目录(当然是在栈顶),就是当前所在的目录。当切换目录之后,栈中的目录也随之改变。通过-c选项可以将目录栈中除当前目录之外的其它目录清除,由于上面的例子中目录栈只包含当前目录,所以没有变化。
1.2 pushd
每次pushd命令执行完成之后,默认都会执行一个dirs命令来显示目录栈的内容。pushd的用法主要有如下几种:
pushd 目录
pushd后面如果直接跟目录使用,会切换到该目录并且将该目录置于目录栈的栈顶。(时时刻刻都要记住,目录栈的栈顶永远存放的是当前目录。如果当前目录发生变化,那么目录栈的栈顶元素肯定也变了;反过来,如果栈顶元素发生变化,那么当前目录肯定也变了。)下面是一个例子:
$ pwd /home/lfqy $ pushd / / ~ $ dirs -v 0 / 1 ~ $ pushd ~/Music/ ~/Music / ~ $ dirs -v 0 ~/Music 1 / 2 ~ $
这样,不难看出,用pushd在切换目录的同时,也将历史目录以栈结构的形式保存了下来。
pushd不带任何参数。
pushd不带任何参数执行的效果就是,将目录栈最顶层的两个目录进行交换。前面说过,栈顶目录和当前目录一个发生变化,另一个也变。这样,实际上,就实现了cd -的功能。下面是一个例子(这个例子接上文的执行现场):
$ dirs -v 0 ~/Music 1 / 2 ~ $ pushd / ~/Music ~ $ dirs -v 0 / 1 ~/Music 2 ~ $ pushd ~/Music / ~ $ dirs -v 0 ~/Music 1 / 2 ~ $
pushd +n
到这里,可能会想如果想切换到目录栈中的任意一个目录,该如何?pushd +n正是这个作用:pushd +n切换到目录栈中的第n个目录(这里的n就是dirs -v命令展示的index),并将该目录以栈循环的方式推到栈顶。下面是一个例子(接上文的执行现场),注意栈循环的方式带来的栈中内容的变化规律:
$ dirs -v 0 ~/Music 1 / 2 ~ $ pushd +2 ~ ~/Music / $ dirs -v 0 ~ 1 ~/Music 2 / $ pushd +1 ~/Music / ~ $ dirs -v 0 ~/Music 1 / 2 ~ $
1.3 popd
每次popd命令执行完成之后,默认都会执行一个dirs命令来显示目录栈的内容。popd的用法主要有如下几种:
popd不带参数
popd不带任何参数执行的效果,就是将目录栈中的栈顶元素出栈。这时,栈顶元素发生变化,自然当前目录也会发生相应的切换(接上文的执行现场),下面是一个例子:
$ dirs -v 0 ~/Music 1 / 2 ~ $ popd / ~ $ dirs -v 0 / 1 ~ $ popd ~ $ dirs -v 0 ~ $
popd +n
将目录栈中的第n个元素删除(这里的n就是命令dirs -v显示的目录index)。下面是一个例子:
$ dirs -v 0 ~/Music 1 / 2 ~ $ popd +2 ~/Music / $
这里可以发现,如果对于目录栈的操作没有引发栈顶元素的变化,将不会导致当前目录的切换。
2、pushd和popd的+n和-n
上面我们用的都是+n作为参数,实际在使用pushd和popd的时候,有时候也会用到-n参数。两者的差别如下:+n的含义是从栈顶往栈底方向进行计数,从0开始;-n的含义刚好相反,从栈底向栈顶方向计数,从0开始。这样有点拗口,实际上,从默认的dirs命令(不带任何参数)的输出来解释最好理解了:+n是指从左往右数,-n是指从右往左数,都是从0开始。
作者:SpaceCat
链接:http://www.jianshu.com/p/53cccae3c443
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以上是关于使用 pushd 和 popd 实现快速切换目录的主要内容,如果未能解决你的问题,请参考以下文章
linux怎么连续退回上次目录?cd - 只能在两个目录间来回切换(autojump)(pushd popd dirs)
Linux命令:用“dirs”“pushd”“popd”来操作目录栈