Linux小技巧_pushd/popd/dirs

本文详细介绍pushd、popd及dirs命令的功能与用法,包括如何利用这些命令高效地在多个目录间切换,以及通过实例展示如何自定义别名以增强其实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Outline 

- 1.pushd / popd /dirs 命令详解

- 2.改进

- 3.例子

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

1. pushd / popd / dirs 详解

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

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

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

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


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

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

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

参数说明:

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


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

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

参数说明:

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

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

最常用的方法是使用:

push oldDir
cd /anotherDir/.....
dirs -v
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:

alias dirs="dirs -v"

pcd() {
 dirs
 read opt
 if [ $opt -ne 0 ];then
        opt=$(($opt-1))
        popd 1>/dev/null
        pushd +$opt 1>/dev/null
        pushd . 1>/dev/null
 else
 return
 fi
}


3.例子:

deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ pwd
/home/deepsky/bspXXX/subDir1/subDir2/subDir3/subDir4
deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ pushd .
deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ dirs
 0  ~/bspXXX/subDir1/subDir2/subDir3/subDir4
 1  ~/bspXXX/subDir1/subDir2/subDir3/subDir4
deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ cd /usr/src/linux-headers-2.6.26-2-686/kernel
deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ pushd .
/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
deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ dirs
 0  /usr/src/linux-headers-2.6.26-2-686/kernel
 1  /usr/src/linux-headers-2.6.26-2-686/kernel
 2  ~/bspXXX/subDir1/subDir2/subDir3/subDir4
deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ pcd
 0  /usr/src/linux-headers-2.6.26-2-686/kernel
 1  /usr/src/linux-headers-2.6.26-2-686/kernel
 2  ~/bspXXX/subDir1/subDir2/subDir3/subDir4
1
deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ dirs
 0  /usr/src/linux-headers-2.6.26-2-686/kernel
 1  /usr/src/linux-headers-2.6.26-2-686/kernel
 2  ~/bspXXX/subDir1/subDir2/subDir3/subDir4
deepsky@Debian:/usr/src/linux-headers-2.6.26-2-686/kernel$ pcd
 0  /usr/src/linux-headers-2.6.26-2-686/kernel
 1  /usr/src/linux-headers-2.6.26-2-686/kernel
 2  ~/bspXXX/subDir1/subDir2/subDir3/subDir4
2
deepsky@Debian:~/bspXXX/subDir1/subDir2/subDir3/subDir4$ dirs
 0  ~/bspXXX/subDir1/subDir2/subDir3/subDir4
 1  ~/bspXXX/subDir1/subDir2/subDir3/subDir4
 2  /usr/src/linux-headers-2.6.26-2-686/kernel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值