Linux cd dirs pushed popd
在命令行模式下,当需要切换不同目录中,很多时间都浪费在重复输入上如果这些目录不在同一个根目录中,有时候不得不在转换时输入完整的路径名,这难免让人有些难以忍受,可以用以下的一个或两个步骤来避免所有多余的输入:用命令行解释器中的历史记录,或者用命令行函数pushd。
用命令行解释器中的历史记录的好处是只需按很少的键在命令行中用向上的箭头来查找使用过的命令,直到找到目标,然后按回车键如果所切换的两个目录在整个驱动器的子目录结构中很接近,那用解释器中的历史记录可能是最好的选择。
如果在两个截然不同的路径间转换的话,可以很好的使用pushd这个函数,可以用它创建一个目录堆栈(在内存中的一个列表)。
:::tips
注释:缺省情况下,pushd函数可能不包括在Linux系统中;但它包涵在Red Hat和用Red Hat驱动的系统中如果系统中没有pushd函数,可以在ibiblio.org网站上下载相关的函数工具。
:::
pushd的使用:假设现在工作在/usr/share/fonts/目录下,需要对/usr/share/fonts/做一些改动,将频繁的在两个目录间切换开始在一个目录下,用pushd函数切换到另一个目录在例子中,开始在/usr/share/fonts/下,键入pushd /home/yxy/,然后按回车键现在,将在下一行看到堆栈中的内容:/home/yxy /usr/share/fonts。
正如所看到的,当键入pushd和一个路径名时,将自动产生一个堆栈,内容是键入的目录名和当前工作的目录名,在例子中,键入的路径(/opt/wonderword/fonts)在堆栈的顶部。
快速返回上一级目录,可以直接键入pushd,如果不跟路径名,将返回到堆栈中前一个目录的上一层目录。
如果需要从堆栈中删除一个目录,键入popd,然后是目录名称,再按回车键想查看堆栈中目录列表,键入dirs,然后按回车键popd和dirs命令也是常用函数中的一部分。
:::info
说明: pushd、popd、dirs 这几个命令是bash内建的命令,所以只要登录到了bash,这几个命令就可以使用了。
:::
cd
cd -在两个目录之间切换
如果只是在两个目录之间切换,那么还不必使用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]#
在两个目录之间切换非常方便,无需再输入很长的路径。
说明:- 在此处等同于 $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
:::success
结论: 用cd -和cd $OLDPWD都可以在最近所操作的两个目录之间进行切换。
:::
pushed
pushd在多个目录之间切换
因为 cd -和 cd $OLDPWD都是只支持最近操作的两个目录,所以要在多个目录之间操作时,需要使用 pushd。
pushd:切换到作为参数的目录,并把原目录和当前目录压入到一个虚拟的堆栈中如果不指定参数,则会回到前一个目录,并把堆栈中最近的两个目录作交换。popd:弹出堆栈中最近的目录。dirs: 列出当前堆栈中保存的目录列表。
例子:
[root@localhost ~]# pushd /usr/local/sbin//usr/local/sbin ~[root@localhost sbin]# dirs/usr/local/sbin ~[root@localhost sbin]# dirs -p -v0 /usr/local/sbin1 ~[root@localhost sbin]# pushd /usr/share/kde4/apps/kget//usr/share/kde4/apps/kget /usr/local/sbin ~[root@localhost kget]# dirs -p -v0 /usr/share/kde4/apps/kget1 /usr/local/sbin2 ~
说明: dirs的 -p参数可以每行一个目录的形式显示堆栈中的目录列表;-v 参数可以在目录前加上编号;
注意:有 -v时,不添加 -p也可以每行一个目录的形式显示。
说明之二:可以看到:最近压入堆栈的目录位于最上面。
pushd在最近的两个目录之间切换
在最近的两个目录之间切换:用pushd不加参数即可
[root@localhost kget]# pushd /boot/grub//boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~[root@localhost grub]# dirs -v0 /boot/grub1 /usr/share/kde4/apps/kget2 /usr/local/sbin3 ~[root@localhost grub]# pushd/usr/share/kde4/apps/kget /boot/grub /usr/local/sbin ~[root@localhost kget]# dirs -v0 /usr/share/kde4/apps/kget1 /boot/grub2 /usr/local/sbin3 ~[root@localhost kget]# pushd/boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~[root@localhost grub]# dirs -v0 /boot/grub1 /usr/share/kde4/apps/kget2 /usr/local/sbin3 ~
说明:可以看到,用pushd不加参数在最近的两个目录之间切换时,当前目录总是位于堆栈的最上面。
pushd +n在多个目录之间切换
说明: n 是一个数字,有此参数时,是切换到堆栈中的第n个目录,并把此目录以堆栈循环的方式推到堆栈的顶部。
需要注意:堆栈从第0个开始数起。
例子:
[root@localhost grub]# dirs -v0 /boot/grub1 /usr/share/kde4/apps/kget2 /usr/local/sbin3 ~[root@localhost grub]# pushd +2/usr/local/sbin ~ /boot/grub /usr/share/kde4/apps/kget[root@localhost sbin]# dirs -v0 /usr/local/sbin1 ~2 /boot/grub3 /usr/share/kde4/apps/kget
popd把目录从堆栈中删除
例子:
root@localhost sbin]# dirs -v0 /usr/local/sbin1 ~2 /boot/grub3 /usr/share/kde4/apps/kget[root@localhost sbin]# popd~ /boot/grub /usr/share/kde4/apps/kget[root@localhost ~]# dirs -v0 ~1 /boot/grub2 /usr/share/kde4/apps/kget[root@localhost ~]# popd +1~ /usr/share/kde4/apps/kget[root@localhost ~]# dirs -v0 ~1 /usr/share/kde4/apps/kget
说明:可以看到popd不加参数的运行情况:
popd把堆栈顶端的目录从堆栈中删除,并切换于位于新的顶端的目录。
说明之二: popd 加有参数 +n时,n 是堆栈中的第n个目录,表示把堆栈中第n个目录从堆栈中删除。
pushd和popd都可以只影响堆栈而不切换目录
用 -n 参数即可。看例子:
[root@localhost ~]# dirs -v0 ~1 /usr/share/kde4/apps/kget[root@localhost ~]# pushd -n /boot/grub~ /boot/grub /usr/share/kde4/apps/kget[root@localhost ~]# dirs -v0 ~1 /boot/grub2 /usr/share/kde4/apps/kget
dirs
dirs用 -c参数可以清空目录堆栈
例子:
[root@localhost ~]# dirs -v0 ~1 /boot/grub2 /usr/share/kde4/apps/kget[root@localhost ~]# dirs -c[root@localhost ~]# dirs -v0 ~
:::warning 说明: 位于堆栈顶部的目录是当前目录,它不能被pop出去的。 :::
