首页 帮助中心 常见问题 Linux使用pushd和popd高效切换目录
Linux使用pushd和popd高效切换目录
时间 : 2024-09-04 14:31:48 编辑 : 华纳云 阅读量 : 179

  pushd和popd是对一个目录栈进行操作,而dirs是显示目录栈的内容。而目录栈就是一个保存目录的栈结构,该栈结构的顶端永远都存放着当前目录。
  Linux下使用pushd和popd高效切换目录插图
  1、pushd、popd和dirs
  1.1 dirs
  dirs常用的有两个参数:
  选项    含义
  -p    每行显示一条记录
  -v    每行显示一条记录,同时展示该记录在栈中的index
  -c    清空目录栈
  下面没有显示地对目录栈进行任何操作,我们来看下当前目录栈的内容是什么:
  $ 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开始。

华纳云 推荐文章
Windows上使用C#访问Ubuntu上Redis数据库 如何使用Bash补全功能简化linux和Docker命令行 如何使用SSHFS挂载远程目录 Linux中使用dd完成低级数据复制 Linux中显示和管理IP地址设置 如何在Ubuntu上安装Deepin桌面环境 Ubuntu 16.04.1上搭建Redis分布式集群并使用C#操作 Opera进入Ubuntu其他GNU/Linux发行版snap生态应用 windows防火墙如何设置FTP服务方法 CentOS 7环境下使用Nginx托管.Net Core应用程序
客服咨询
7*24小时技术支持
技术支持
渠道支持