Chinaunix首页 | 论坛 | 博客
  • 博客访问: 282007
  • 博文数量: 68
  • 博客积分: 125
  • 博客等级: 入伍新兵
  • 技术积分: 606
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-12 15:35
文章分类

全部博文(68)

文章存档

2014年(5)

2013年(59)

2012年(4)

分类: LINUX

2013-04-17 10:17:44

原文地址:Linux小技巧_pushd/popd/dirs 作者:deepsky24

Outline 

- 1.pushd / popd /dirs 命令详解
- 2.改进
- 3.例子

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

1. pushd / popd / dirs 详解

最近有个项目用到了一个BSP,需要修改原始包中的一些文件。但是,BSP包中的目录往往嵌套的很深,如:

  1. ~/bspXXX/subDir1/subDir2/subDir3/subDir4/foo.c

通常修改完文件以后,会返回到顶层目录调用makefile:

  1. ~/bspXXX/make
此时,在最近访问的两个目录之间切换可以使用,将返回上一次所在的目录:

  1. cd -

 

但是如果想要在多个访问过的长目录之间切换呢?这时候我们可以用到 pushd/popd/dirs 命令。

 

pushd可以将指定目录 压入当前shell维护的目录栈(注意:目录栈的第0个目录也即栈顶目录始终是当前目录):

  1. pushd: usage: pushd [dir | +N | -N] [-n]

参数说明:

  1. 目录 将该目录加入到栈顶,并执行"cd 目录",切换到该目录
  2. +N 将第N个目录移至栈顶(从左或上边数起,数字从0开始)
  3. -N 将第N个目录移至栈顶(从右或下边数起,数字从0开始)
  4. -n 将目录入栈时,不切换目录

 

popd可以将指定目录 从当前目录栈中弹出:

  1. popd: usage: popd [+N | -N] [-n]

参数说明:

  1. +N 将第N个目录删除(从左或下边数起,数字从0开始)
  2. -N 将第N个目录删除(从右或下边数起,数字从0开始)
  3. -n 将目录出栈时,不切换目录

dirs命令用于查看当前目录栈内存放的目录即顺序:
  1. dirs: usage: dirs [-clpv] [+N] [-N]
参数说明:
  1. -c 删除目录栈中的所有记录
  2. -l 以完整格式显示
  3. -p 一个目录一行的方式显示
  4. -v 每行一个目录来显示目录栈的内容,每个目录前加上的编号
  5. +N 显示从左到右的第n个目录,数字从0开始
  6. -N 显示从右到左的第n个日录,数字从0开始

最常用的方法是使用:
  1. push oldDir
  2. cd /anotherDir/.....
  3. dirs -v
  4. pushd +N (N is the index of oldDir)

 

2.改进:

由于每次使用pushd +N返回到oldDir后,oldDir已经位于栈顶,此时再切换到其他目录后,oldDir即被覆盖在栈中被删除。如果oldDir是一个常用的目录,则会很不方便(每次用pushd +N切换回oldDir之后,再切换到其他目录之前,必须再执行一次pushd oldDir),因此,可以在bashrc中添加一个新命令pcd,切换回oldDir后,自动pushd oldDir:

  1. alias dirs="dirs -v"

  2. pcd() {
  3.  dirs
  4.  read opt
  5.  if [ $opt -ne 0 ];then
  6.         opt=$(($opt-1))
  7.         popd 1>/dev/null
  8.         pushd +$opt 1>/dev/null
  9.         pushd . 1>/dev/null
  10.  else
  11.  return
  12.  fi
  13. }

 

3.例子:

  1. deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ pwd
  2. /home/deepsky/bspXXX/subDir1/subDir2/subDir3/subDir4
  3. deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ pushd .
  4. deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ dirs
  5.  0 ~/bspXXX/subDir1/subDir2/subDir3/subDir4
  6.  1 ~/bspXXX/subDir1/subDir2/subDir3/subDir4
  7. deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ cd /usr/src/linux-headers-2.6.26-2-686/kernel
  8. deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ pushd .
  9. /usr/src/linux-headers-2.6.26-2-686/kernel /usr/src/linux-headers-2.6.26-2-686/kernel ~/bspXXX/subDir1/subDir2/subDir3/subDir4
  10. deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ dirs
  11.  0 /usr/src/linux-headers-2.6.26-2-686/kernel
  12.  1 /usr/src/linux-headers-2.6.26-2-686/kernel
  13.  2 ~/bspXXX/subDir1/subDir2/subDir3/subDir4
  14. deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ pcd
  15.  0 /usr/src/linux-headers-2.6.26-2-686/kernel
  16.  1 /usr/src/linux-headers-2.6.26-2-686/kernel
  17.  2 ~/bspXXX/subDir1/subDir2/subDir3/subDir4
  18. 1
  19. deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ dirs
  20.  0 /usr/src/linux-headers-2.6.26-2-686/kernel
  21.  1 /usr/src/linux-headers-2.6.26-2-686/kernel
  22.  2 ~/bspXXX/subDir1/subDir2/subDir3/subDir4
  23. deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ pcd
  24.  0 /usr/src/linux-headers-2.6.26-2-686/kernel
  25.  1 /usr/src/linux-headers-2.6.26-2-686/kernel
  26.  2 ~/bspXXX/subDir1/subDir2/subDir3/subDir4
  27. 2
  28. deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ dirs
  29.  0 ~/bspXXX/subDir1/subDir2/subDir3/subDir4
  30.  1 ~/bspXXX/subDir1/subDir2/subDir3/subDir4
  31.  2 /usr/src/linux-headers-2.6.26-2-686/kernel
阅读(1331) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~