Linux之pushd、popd和dirs的使用讲解,比 cd -更高效

其实,很早就知道pushd和popd在linux中可以用来方便地在多个目录之间切换。那时比较浮躁,感觉切换目录没必要这么复杂。在实际中,发现通过使用pushd和popd能够极大地提高效率。

0、命令dirs、pushd、popd语法

dirs命令

[root@testserver ~]# help main dirs
dirs: dirs [-clpv] [+N] [-N]
    显示目录栈。
    显示当前记住的目录列表。通过 `pushd' 命令可以将目录存入列表中;`popd' 命令可用于遍历列表。
    选项:
      -c        删除所有元素以清空目录栈
      -l        不打印与主目录相关的波浪号前缀的目录
      -p        每行一个条目打印目录栈
      -v        每行一个条目,以栈中位置为前缀打印目录栈
    参数:
      +N        显示 dirs 不带选项启动时显示的目录列表左起中第N 个目录,从零开始。
      -N        显示 dirs 不带选项启动时显示的目录列表右起中第N 个目录,从零开始。
    退出状态:
    返回成功,除非使用了无效的选项或者发生错误。

 

pushd命令

[root@testserver ~]# help main pushd
pushd: pushd [-n] [+N | -N | dir]
    将目录添加到栈中。
    将目录添加到目录栈顶,或着旋转栈直到当前工作目录成为    新的栈顶。不带参数时,交换栈顶的两个目录。
    选项:
      -n        抑制添加目录至栈时通常的改变目录操作,从而仅对栈进行操作。
    参数:
      +N        旋转栈从而第 N 个目录(`dirs' 显示的列表中左起,从零开始)将移动到栈顶。
      -N        旋转栈从而第 N 个目录(`dirs' 显示的列表中右起,从零开始)将移动到栈顶。
      dir       将 DIR 目录添加到栈顶,并且使其成为当前工作目录。
    `dirs' 内嵌显示目录栈。
    退出状态:
    返回成功,除非使用了无效的参数或者目录转换失败。

 

popd命令

[root@testserver ~]# help main popd
popd: popd [-n] [+N | -N]
    从栈中删除目录。
    从目录栈中删除条目。不带参数时,删除栈顶目录,并改变至新的栈顶目录。
    选项:
      -n        抑制从栈中删除目录时通常的目录变换操作,从而仅对栈进行操作。
    参数:
      +N        删除第 N 个目录(`dirs' 显示的目录列表中左起,从零开始)。
        例如: `popd +0' 删除第一个目录,popd +1' 删除第二个。
      -N        删除第 N 个目录(`dirs' 显示的目录列表中右起,从零开始)。
        例如: `popd -0'删除最后一个目录,,`popd -1' 删除倒数第二个。
    `dirs' 内嵌显示目录栈。
    退出状态:
    返回成功,除非使用了无效的参数或者目录变换失败。

 

1、使用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
$ 

 

2、pushd、popd和dirs

pushd和popd是对一个目录栈进行操作,而dirs是显示目录栈的内容。而目录栈就是一个保存目录的栈结构,该栈结构的顶端永远都存放着当前目录(这里点从下面可以进一步看到)。

2.1 dirs

dirs常用的有两个参数:

选项含义
-p 每行显示一条记录
-v 每行显示一条记录,同时展示该记录在栈中的index
-c 清空目录栈

下面没有显示地对目录栈进行任何操作,我们来看下当前目录栈的内容是什么:

可以看出,目录栈中只有一个目录(当然是在栈顶),就是当前所在的目录。当切换目录之后,栈中的目录也随之改变。通过-c选项可以将目录栈中除当前目录之外的其它目录清除,由于上面的例子中目录栈只包含当前目录,所以没有变化。

2.2 pushd

每次pushd命令执行完成之后,默认都会执行一个dirs命令来显示目录栈的内容。pushd的用法主要有如下几种:

$ pwd
/home/lfqy
$ dirs -v
 0  ~
$ cd /
$ dirs -v
 0  /
$ dirs -c
$ dirs -v
 0  /
$ 

 

  1. pushd 目录

    pushd后面如果直接跟目录使用,会切换到该目录并且将该目录置于目录栈的栈顶。(时时刻刻都要记住,目录栈的栈顶永远存放的是当前目录。如果当前目录发生变化,那么目录栈的栈顶元素肯定也变了;反过来,如果栈顶元素发生变化,那么当前目录肯定也变了。)下面是一个例子:

     $ pwd
     /home/lfqy
     $ pushd /
     / ~
     $ dirs -v
      0  /
      1  ~
     $ pushd ~/Music/
     ~/Music / ~
     $ dirs -v
      0  ~/Music
      1  /
      2  ~
     $

    这样,不难看出,用pushd在切换目录的同时,也将历史目录以栈结构的形式保存了下来。

  2. 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  ~
     $ 

     

  3. 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  ~
     $ 

     

2.3 popd

每次popd命令执行完成之后,默认都会执行一个dirs命令来显示目录栈的内容。popd的用法主要有如下几种:

  1. popd不带参数

    popd不带任何参数执行的效果,就是将目录栈中的栈顶元素出栈。这时,栈顶元素发生变化,自然当前目录也会发生相应的切换(接上文的执行现场),下面是一个例子:

     $ dirs -v
      0  ~/Music
      1  /
      2  ~
     $ popd
     / ~
     $ dirs -v
      0  /
      1  ~
     $ popd
     ~
     $ dirs -v
      0  ~
     $ 
  2. popd +n

    将目录栈中的第n个元素删除(这里的n就是命令dirs -v显示的目录index)。下面是一个例子:

     $ dirs -v
      0  ~/Music
      1  /
      2  ~
     $ popd +2
     ~/Music /
     $

    这里可以发现,如果对于目录栈的操作没有引发栈顶元素的变化,将不会导致当前目录的切换。

3、pushd和popd的+n和-n

上面我们用的都是+n作为参数,实际在使用pushd和popd的时候,有时候也会用到-n参数。两者的差别如下:+n的含义是从栈顶往栈底方向进行计数,从0开始;-n的含义刚好相反,从栈底向栈顶方向计数,从0开始。这样有点拗口,实际上,从默认的dirs命令(不带任何参数)的输出来解释最好理解了:+n是指从左往右数,-n是指从右往左数,都是从0开始。

作者:SpaceCat
链接:https://www.jianshu.com/p/53cccae3c443
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

 

出处:https://www.cnblogs.com/lvzh/p/16306877.html

=======================================================================================

Linux中的pushd、popd和dirs的使用讲解

1 问题

我们有时候需要保存多个路径,上下键切换不方便,用cd-只能到上个目录,我们可以用dirs和pushd和popd

2 dirs、pushd、popd

dirs: 这个命令显示栈里面所有的路径,一定会包含当前路径,常用参数如下

dirs -v 显示栈里面的所有路径和下标,通过下标,我们可以用pushd +下标到这个目录,然后popd+下标把这个路径在栈里面弹出来,

dirs -c 清除栈里所有路径,但是当前路径不会删除

pushd:我们可以添加目录到栈(dirs)里面,比如添加当前目录pushd .  然后如果需要到栈里面具体哪个路径的话我们可以pushd +下标,如果是-下标的话,我们是从栈底算起

popd:我们可以弹出栈的最上面的一个路径,我们也可以popd +n弹出栈里面指定的具体路径,如果是-下标的话,我们是从栈底算起

3 使用过程

比如我们在当前目录下新建立4个文件夹dir1、dir2、dir3、dir4

我们cd到dir1里面去,然后把当前路径再添加进去pushd .

我们cd到dir2里面去,然后把当前路径再添加进去pushd .

我们cd到dir3里面去,然后把当前路径再添加进去pushd .

我们cd到dir4里面去,然后把当前路径再添加进去pushd .

我们再查看dirs -v

~/Desktop/linux/dabian/shell/cat/push/dir3

~/Desktop/linux/dabian/shell/cat/push/dir3

~/Desktop/linux/dabian/shell/cat/push/dir4

~/Desktop/linux/dabian/shell/cat/push/dir2

~/Desktop/linux/dabian/shell/cat/push/dir1

很明显当前目录是dir3,比如我们现在要去dir2,我们直接执行pushd +3  再执行dirs -v看下

~/Desktop/linux/dabian/shell/cat/push/dir2

~/Desktop/linux/dabian/shell/cat/push/dir1

~/Desktop/linux/dabian/shell/cat/push/dir3

~/Desktop/linux/dabian/shell/cat/push/dir3

~/Desktop/linux/dabian/shell/cat/push/dir4

很明显我们可以看到当前目录是dir2

比如我们执行下popd,弹出最顶层的那个,目录会切换到最dir1,我们再看下dirs -v

~/Desktop/linux/dabian/shell/cat/push/dir1

~/Desktop/linux/dabian/shell/cat/push/dir3

~/Desktop/linux/dabian/shell/cat/push/dir3

~/Desktop/linux/dabian/shell/cat/push/dir4

然后我们删除dir4看下,popd +4,然后我们再dirs -v看下

~/Desktop/linux/dabian/shell/cat/push/dir1

~/Desktop/linux/dabian/shell/cat/push/dir3

~/Desktop/linux/dabian/shell/cat/push/dir3

很明显当前目录在dir1,我们切换到dir3里面去,pushd +2 然后dirs -v看下

~/Desktop/linux/dabian/shell/cat/push/dir3

~/Desktop/linux/dabian/shell/cat/push/dir1

~/Desktop/linux/dabian/shell/cat/push/dir3

可以看到到了dir3这个目录了,我们再清除所有的栈里面的路径dirs -c,然后我们再dirs看下

~/Desktop/linux/dabian/shell/cat/push/dir3

在当前目录了,没毛病。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文章:Shell中exit和return的区别讲解

在Shell脚本中调用另一个脚本的三种方式讲解

使用shell脚本来给mysql加索引的方法

干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)

linux shell之通过标识测试文件系统属性的方法示例

linux shell中if的各种判断

linux shell之控制台打印各种颜色字体和背景的实现方法

shell脚本实现监控某个进程意外停止后拉起进程

使用shell脚本每天对MySQL多个数据库自动备份的讲解

使用shell来发tcp包的方法

 

出处:https://blog.csdn.net/weixin_32325225/article/details/116752429

=======================================================================================

popd和pushd使用

大家好,又见面了,我是你们的朋友全栈君。

让切换目录更方便: pushd,popd,dirs,cd –

一,为何要使用这几个命令?
   可能大家会有疑问,为何要使用这几个命令,
   难道用cd不就可以切换目录了吗?
   没错,使用cd就可以切换到需要访问的目录,
   但是有时会是一个路径很长,层次很多的目录,进到此目录下后,这时我们不小心运行了 cd命令,
   理所当然,我们回到了自己的home目录,这时如果想回去怎么办?

   还有:因为工作的需要,我们需要不停在几个很深层的目录之间切换,不止一个,
   那么即使有tab键帮忙,我们也会因为一个cd命令花费很多时间,如何在多个目录之间切换时能更方便些
   pushd,popd是我们的好帮手

   说明:  pushd,popd,dirs这几个我们讲到的命令是bash内建的命令,
         所以只要登录到了bash,这几个命令就可以使用了

二,如何在两个目录之间切换?

如果只是在两个目录之间切换,那么还不必使用pushd,
  这时只需使用 cd -就可以了
  cd -的作用是可以回到前一个目录,
  看例子: 
  [root@localhost ~]# cd /usr/share/kde4/apps/kget/pics/
  [root@localhost pics]# cd –
   /root
  [root@localhost ~]# cd –
   /usr/share/kde4/apps/kget/pics
  [root@localhost pics]#

  怎么样?在两个目录之间切换非常方便,无需再输入很长的路径

  说明:
  为何cd -能够回到前一个目录?

  这是因为 -在此处等同于$OLDPWD变量,

  此问题可以参见bash的info信息,

  cd 一项有相关的说明: An argument of - is equivalent to $OLDPWD.

  $OLDPWD变量就是bash所记录的前一个目录

  也就是说$OLDPWD和-相等

下面我们再看一个例子:

  [root@localhost ~]# cd /usr/share/kde4/apps/kget/pics/
  [root@localhost pics]# echo $OLDPWD;
  /root
  [root@localhost pics]# cd $OLDPWD
  [root@localhost ~]# echo $OLDPWD;
  /usr/share/kde4/apps/kget/pics
  [root@localhost ~]# cd $OLDPWD;
  [root@localhost pics]# echo $OLDPWD;
  /root

   我们可以得到结构:  用cd -和cd $OLDPWD都可以在最近所操作的两个目录之间进行切换


三,如何在多个目录之间切换?
  因为 cd -和 cd $OLDPWD都是只支持最近操作的两个目录,所以要在多个目录之间操作时,
  我们需要使用 pushd

  1,先来介绍我们会用到的3条命令

  pushd:切换到作为参数的目录,并把原目录和当前目录压入到一个虚拟的堆栈中
         如果不指定参数,则会回到前一个目录,并把堆栈中最近的两个目录作交换

  popd: 弹出堆栈中最近的目录
  dirs: 列出当前堆栈中保存的目录列表

  看例子:
  [root@localhost ~]# pushd /usr/local/sbin/
  /usr/local/sbin ~
  [root@localhost sbin]# dirs
  /usr/local/sbin ~
  [root@localhost sbin]# dirs -p -v
   0  /usr/local/sbin
   1  ~

[root@localhost sbin]# pushd /usr/share/kde4/apps/kget/
  /usr/share/kde4/apps/kget /usr/local/sbin ~
  [root@localhost kget]# dirs -p -v
   0  /usr/share/kde4/apps/kget
   1  /usr/local/sbin
   2  ~

  说明: dirs的 -p参数可以每行一个目录的形式显示堆栈中的目录列表
              -v参数可以在目录前加上编号
              注意:有 -v时,不添加 -p也可以每行一个目录的形式显示
  说明之二:我们可以看到:最近压入堆栈的目录位于最上面

  2,如何在最近的两个目录之间切换?

   在最近的两个目录之间切换:用pushd不加参数即可

   [root@localhost kget]# pushd /boot/grub/
   /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
 [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~
   [root@localhost grub]# pushd
   /usr/share/kde4/apps/kget /boot/grub /usr/local/sbin ~
   [root@localhost kget]# dirs -v
   0  /usr/share/kde4/apps/kget
   1  /boot/grub
   2  /usr/local/sbin
   3  ~
   [root@localhost kget]# pushd
   /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
   [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~

 说明:可以看到,用pushd不加参数在最近的两个目录之间切换时,
        当前目录总是位于堆栈的最上面

  3,如何在多个目录之间切换?

   用 pushd +n即可
   说明:n是一个数字,有此参数时,是切换到堆栈中的第n个目录,并把此目录以堆栈循环的方式推到堆栈的顶部需要注意: 堆栈从第0个开始数起

   看例子:

   [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~
   [root@localhost grub]# pushd +2
   /usr/local/sbin ~ /boot/grub /usr/share/kde4/apps/kget
   [root@localhost sbin]# dirs -v
   0  /usr/local/sbin
   1  ~

2  /boot/grub
   3  /usr/share/kde4/apps/kget

   4,如何把目录从堆栈中删除?
   用popd即可,看例子:

   [root@localhost sbin]# dirs -v
   0  /usr/local/sbin
   1  ~
   2  /boot/grub
   3  /usr/share/kde4/apps/kget
   [root@localhost sbin]# popd
   ~ /boot/grub /usr/share/kde4/apps/kget
   [root@localhost ~]# dirs -v
   0  ~
   1  /boot/grub
   2  /usr/share/kde4/apps/kget

[root@localhost ~]# popd +1
    ~ /usr/share/kde4/apps/kget
   [root@localhost ~]# dirs -v
   0  ~
   1  /usr/share/kde4/apps/kget

   说明:可以看到popd不加参数的运行情况:
        popd把堆栈顶端的目录从堆栈中删除,并切换于位于新的顶端的目录
   说明之二: popd 加有参数 +n时,
   n是堆栈中的第n个目录,表示把堆栈中第n个目录从堆栈中删除

四,多学一点知识

   1,pushd和popd都可以只影响堆栈而不切换目录用 -n参数即可
 看例子:
    [root@localhost ~]# dirs -v
    0  ~
    1  /usr/share/kde4/apps/kget
    [root@localhost ~]# pushd -n /boot/grub
    ~ /boot/grub /usr/share/kde4/apps/kget
    [root@localhost ~]# dirs -v
     0  ~
     1  /boot/grub
     2  /usr/share/kde4/apps/kget

    2, dirs可以清空目录堆栈
      用 -c参数即可

     看例子:
     [root@localhost ~]# dirs -v
     0  ~
     1  /boot/grub
     2  /usr/share/kde4/apps/kget
     [root@localhost ~]# dirs -c
 [root@localhost ~]# dirs -v
     0  ~

     说明:  位于堆栈顶部的目录是当前目录,它不能被pop出去的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126100.html原文链接:https://javaforall.cn


 

出处:https://javaforall.cn/126100.html

=======================================================================================

【Linux命令】pushd、popd 实现目录快速跳转(优于cd -)

 

# pushd 和 popd 一般用于【切换到最近的目录】,而且栈中最好不要多于三个目录
# 问为什么不用 cd - 呢? —— 因为层级问题
$ cd a
$ cd b
$ cd c
$ pwd
~/a/b/c
# 若是现在执行 cd -,只会返回到 ~/a/b 目录
# 若要返回到 a 目录呢? —— cd - 无法一步达成,pushd 和 popd 可以实现
# 首先压栈
$ pushd ~/a
# 若当前处于 c 目录,直接一步返回到 ~/a 目录,下面两种方法都可以
$ pushd  # 不删除堆栈
$ popd # 删除堆栈中信息

pushd:切换到作为参数的目录,并把原目录和当前目录压入到一个虚拟的堆栈中
       如果不指定参数,则会回到前一个目录,并把堆栈中最近的两个目录作交换

popd: 弹出堆栈中最近的目录
dirs: 列出当前堆栈中保存的目录列表
# 举例
 [root@localhost ~]# pushd /usr/local/sbin/
  /usr/local/sbin ~
  [root@localhost sbin]# dirs
  /usr/local/sbin ~
  [root@localhost sbin]# dirs -p -v
   0  /usr/local/sbin
   1  ~

 
# pushd 详解
如何在最近的两个目录之间切换? —— 在最近的两个目录之间切换:用pushd不加参数即可
说明:可以看到,用pushd不加参数在最近的两个目录之间切换时,当前目录总是位于堆栈的最上面
   [root@localhost kget]# pushd /boot/grub/  # pushd 后面可以指定目录
   /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
   [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~
   [root@localhost grub]# pushd  # 切换最近的目录  就是栈顶
   /usr/share/kde4/apps/kget /boot/grub /usr/local/sbin ~
   [root@localhost kget]# dirs -v
   0  /usr/share/kde4/apps/kget
   1  /boot/grub
   2  /usr/local/sbin
   3  ~
   [root@localhost kget]# pushd # 切换最近的目录  就是栈顶
   /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
   [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~
如何在多个目录之间切换?—— 用 pushd +n即可
     # 查看当前目录栈
   [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~
   # 切换到 /usr/local/sbin 目录
   [root@localhost grub]# pushd +2
   /usr/local/sbin ~ /boot/grub /usr/share/kde4/apps/kget
   # 可以看到切换成功
   [root@localhost sbin]# dirs -v
   0  /usr/local/sbin
   1 

# pop 详解
如何把目录从堆栈中删除? —— 用popd即可
 [root@localhost sbin]# dirs -v
   0  /usr/local/sbin
   1  ~
   2  /boot/grub
   3  /usr/share/kde4/apps/kget
   [root@localhost sbin]# popd
   ~ /boot/grub /usr/share/kde4/apps/kget
   [root@localhost ~]# dirs -v
   0  ~
   1  /boot/grub
   2  /usr/share/kde4/apps/kget
 
 [root@localhost ~]# popd +1
    ~ /usr/share/kde4/apps/kget
   [root@localhost ~]# dirs -v
   0  ~
   1  /usr/share/kde4/apps/kget
# dirs 详解
 [root@localhost kget]# dirs -p -v
   0  /usr/share/kde4/apps/kget
   1  /usr/local/sbin
   2  ~

 说明: dirs的 -p参数可以每行一个目录的形式显示堆栈中的目录列表
              -v参数可以在目录前加上编号
              注意:有 -v时,不添加 -p也可以每行一个目录的形式显示
 说明之二:我们可以看到:最近压入堆栈的目录位于最上面
 
dirs可以清空目录堆栈 用 -c参数即可
 [root@localhost ~]# dirs -c
 
 [root@localhost ~]# dirs -v  # 说明:  位于堆栈顶部的目录是当前目录,它不能被pop出去的 
     0  ~
 
# 其他说明
pushd和popd都可以只影响堆栈而不切换目录,用 -n参数即可

 

出处:https://blog.csdn.net/qq_24433609/article/details/128132924

=======================================================================================

posted on 2023-04-21 09:51  jack_Meng  阅读(3894)  评论(0编辑  收藏  举报

导航