|
导读】在 Linux 下切换目录,你还是只会 cd 这个命令吗? 快来学习下 pushd popd 命令吧,让你切换目录更加的方便。 在命令行模式下,当你工作在不同目录中,你将发现你有很多时间都浪费在重复输入上如果这些目录不在同一个根目录中,你不得不在转换时输入完整的路径名,这难免让人有些难以忍受但你可以用以下的一个或两个步骤来避免所有多余的输入:用命令行解释器中的历史记录,或者用命令行函数pushd。 用命令行解释器中的历史记录的好处是只需按很少的键在命令行中用向上的箭头来查找你用过的命令,直到你找到,然后按回车键如果你所切换的两个目录在整个驱动器的子目录结构中很接近,那用解释器中的历史记录可能是你最好的选择。 然而,如果你在两个截然不同的路径间转换的话,你可能很希望利用pushd这个函数,你可以用它创建一个目录堆栈(在内存中的一个列表)。 注释:缺省情况下,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命令也是常用函数中的一部分。
4 x# j! e0 Z% y# A% S; O) ^: o
一,为何要使用这几个命令?
6 A5 R5 c' o9 y3 D
可能大家会有疑问,为何要使用这几个命令,难道用cd不就可以切换目录了吗?
! G. v& Q# t. T, {: e
没错,使用cd就可以切换到需要访问的目录,但是有时会是一个路径很长,层次很多的目录,进到此目录下后,这时我们不小心运行了 cd命令,理所当然,我们回到了自己的home目录,这时如果想回去怎么办? 还有:因为工作的需要,我们需要不停在几个很深层的目录之间切换,不止一个,那么即使有tab键帮忙,我们也会因为一个cd命令花费很多时间,如何在多个目录之间切换时能更方便些呢? 8 v1 z& J0 d, M
pushd、popd是我们的好帮手 说明: pushd、popd、dirs 这几个我们讲到的命令是bash内建的命令,所以只要登录到了bash,这几个命令就可以使用了。 二,如何在两个目录之间切换? 如果只是在两个目录之间切换,那么还不必使用pushd,这时只需使用 cd -就可以了。 cd - 的作用是可以回到前一个目录。 看例子: - % l# T, f* K+ `- a
- [root@localhost ~]# cd /usr/share/kde4/apps/kget/pics/6 g3 Z) h% ] s% I
- [root@localhost pics]# cd -/ w6 n" S \" }% J/ w) S( r6 \
- /root3 K& a% y u! t1 I# L
- [root@localhost ~]# cd -) x6 F% h, [8 s+ ?
- /usr/share/kde4/apps/kget/pics) w, r- W# b- }' d3 L L( a3 d4 B
- [root@localhost pics]#
复制代码 ' y( Z( ]. _7 e; ]: T- z: q
3 z& G. b7 C! r$ i; x& f! ~
怎么样?在两个目录之间切换非常方便,无需再输入很长的路径。 说明: 为何cd -能够回到前一个目录? 这是因为 - 在此处等同于 $OLDPWD变量,此问题可以参见bash的info信息, cd 一项有相关的说明: An argument of - is equivalent to $OLDPWD。 $OLDPWD变量就是bash所记录的前一个目录,也就是说:$OLDPWD 和 - 相等。 下面我们再看一个例子:
3 n' v7 r- F! C$ Z/ K* H0 z$ q- [root@localhost ~]# cd /usr/share/kde4/apps/kget/pics/0 w. H& h6 O: V; N$ {
- [root@localhost pics]# echo $OLDPWD;
! ]) g# C N; F9 C5 ~9 n - /root2 `) i! j" d1 @0 ]% B
- [root@localhost pics]# cd $OLDPWD
& I, S% b7 }+ \ - [root@localhost ~]# echo $OLDPWD;- l3 G5 l/ q7 I. O
- /usr/share/kde4/apps/kget/pics
( ^# D. I: X1 m4 H3 `" y2 M - [root@localhost ~]# cd $OLDPWD;- U$ r! T5 y/ P
- [root@localhost pics]# echo $OLDPWD;+ P2 Q6 U( A% N r& u" p5 {
- /root
复制代码 7 Z3 l3 @2 L9 V, C! i: H+ c
0 P3 Q$ A* b7 R( ~4 a$ U8 d
我们可以得到结构: 用cd -和cd $OLDPWD都可以在最近所操作的两个目录之间进行切换。 三,如何在多个目录之间切换? $ W9 q" a4 [: d c; F8 L/ \
因为 cd -和 cd $OLDPWD都是只支持最近操作的两个目录,所以要在多个目录之间操作时,我们需要使用 pushd。 1、先来介绍我们会用到的3条命令 看例子:
* O& u; u. N' Z0 q) t# p6 q- K- [root@localhost ~]# pushd /usr/local/sbin/
l \8 r2 h4 g0 ^ - /usr/local/sbin ~
( n8 [+ T( i, e+ l8 @ ] - [root@localhost sbin]# dirs
0 _/ E' Y* G- F/ Y - /usr/local/sbin ~
# A" _1 i) K8 X8 z. G3 g; f! @) d { - [root@localhost sbin]# dirs -p -v, d: n" Z) U- g" f0 P# W; d1 D7 e
- 0 /usr/local/sbin3 P! x0 S% ~: I }( S6 R
- 1 ~
7 b4 [! R0 D5 t - [root@localhost sbin]# pushd /usr/share/kde4/apps/kget/& S; X2 P, m: b* ]" n H; g3 D* q
- /usr/share/kde4/apps/kget /usr/local/sbin ~
! A* g! E8 z9 ]: t7 m- B - [root@localhost kget]# dirs -p -v4 |. V% u( m `2 E: ~5 @- @
- 0 /usr/share/kde4/apps/kget9 Z: h, @" h9 s7 j0 [
- 1 /usr/local/sbin
3 }: R3 H3 X5 ], Q - 2 ~
复制代码
: k& ^* Q s8 n" d, e8 y! E
' U. u7 N- ?! \6 ]
说明: dirs的 -p参数可以每行一个目录的形式显示堆栈中的目录列表; -v 参数可以在目录前加上编号; 注意:有 -v时,不添加 -p也可以每行一个目录的形式显示。 说明之二:我们可以看到:最近压入堆栈的目录位于最上面。 2,如何在最近的两个目录之间切换? 在最近的两个目录之间切换:用pushd不加参数即可 - : m$ i, g4 \; A. M& \, O
- [root@localhost kget]# pushd /boot/grub/
5 B5 B( p% V9 a& m0 ?1 p$ m - /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~% p8 c6 [% T5 U1 N) m) R$ e/ D a
- [root@localhost grub]# dirs -v
& \; t4 [ J8 f- l/ o1 X: s6 ] - 0 /boot/grub
D) F6 ?. f9 J5 z0 a+ i - 1 /usr/share/kde4/apps/kget
j" T q: D; c2 ^ - 2 /usr/local/sbin
; T0 C9 q. u5 w i* W; P4 y - 3 ~
7 d" K! {! K2 @ - [root@localhost grub]# pushd
f. A- q8 }, G- N3 T& E( B t: ] - /usr/share/kde4/apps/kget /boot/grub /usr/local/sbin ~
' P) v. `- v6 ~8 d - [root@localhost kget]# dirs -v# B6 h: b* w8 F/ m( A% R* X# o% R' _
- 0 /usr/share/kde4/apps/kget6 J# W, E# T" d; X* C$ i
- 1 /boot/grub# Y5 G8 e. p5 R3 U9 J3 W6 X
- 2 /usr/local/sbin
+ C7 |/ s+ M4 o d! H, k - 3 ~5 `1 \3 U! i1 b: }/ ?
- [root@localhost kget]# pushd4 y; U7 t9 c. i9 G1 c
- /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
( t" X: |# h. o( Z$ u7 _% R3 l( W" y - [root@localhost grub]# dirs -v
6 q) F& e; J2 L+ n' I; w: A - 0 /boot/grub! I" J) d9 P! G
- 1 /usr/share/kde4/apps/kget
\7 _6 u2 g) [) X8 Y4 F# \ - 2 /usr/local/sbin3 j/ `. q1 O% A/ r4 \2 @/ B
- 3 ~
复制代码 ' F. y. B( `9 `0 ]8 S5 b! B
. S$ e b" E' k: c
说明:可以看到,用pushd不加参数在最近的两个目录之间切换时,当前目录总是位于堆栈的最上面。 3,如何在多个目录之间切换? 用 pushd +n 即可 说明: n 是一个数字,有此参数时,是切换到堆栈中的第n个目录,并把此目录以堆栈循环的方式推到堆栈的顶部。 6 r& W6 H, m# K" N, V
需要注意:堆栈从第0个开始数起。
& F6 E5 E9 W( T2 g: b8 C" \# r! L
看例子:
7 V8 d3 ]1 f3 L$ \2 T5 ]$ V( R/ d- [root@localhost grub]# dirs -v2 }3 X% U* Y+ C+ ]# [9 o" L, F5 R
- 0 /boot/grub' u8 ^1 ?; S: }* _
- 1 /usr/share/kde4/apps/kget3 {, F. [6 [4 G% h
- 2 /usr/local/sbin4 t0 `8 L+ u* a8 n1 G) @
- 3 ~2 U+ y+ ~( Q# \/ |8 {7 a7 {) y
- [root@localhost grub]# pushd +2
+ V, o; n; h. j5 T5 d3 B - /usr/local/sbin ~ /boot/grub /usr/share/kde4/apps/kget
7 N4 b/ P7 r/ Z - [root@localhost sbin]# dirs -v' w- E( |( |; t4 Y
- 0 /usr/local/sbin
9 [' w8 D/ y7 V" D% `6 x& V - 1 ~" h+ K$ W2 o j, A' D
- 2 /boot/grub+ @! N4 s. u: D& b; r" i6 y& c
- 3 /usr/share/kde4/apps/kget
复制代码
# n0 n8 B9 b H% n; Q6 V
% |+ d8 O4 e& Z, `4 {, L% u
$ g9 F% o" a' L( F: W
4,如何把目录从堆栈中删除? 用popd即可。 看例子:
1 q: p5 l- m4 K2 _8 M: A3 R- root@localhost sbin]# dirs -v& G* S6 M8 ^* i
- 0 /usr/local/sbin; c# k7 Y; {1 j J6 w/ R' U$ |
- 1 ~; f1 C4 O' m9 P2 u$ C3 e
- 2 /boot/grub
: m$ o+ o7 |8 A; l - 3 /usr/share/kde4/apps/kget3 a; X1 I$ k8 x+ O W+ K* D2 U
- [root@localhost sbin]# popd7 x0 Z# K* _, h& {" [5 S, V
- ~ /boot/grub /usr/share/kde4/apps/kget& J1 L R5 ~3 `$ @4 p
- [root@localhost ~]# dirs -v5 |8 o3 J' Z+ D" o F/ I7 i2 N
- 0 ~8 @( N5 H# C7 v9 R# Z; C; O
- 1 /boot/grub
6 X3 B7 }/ U+ Y- L - 2 /usr/share/kde4/apps/kget% T, g! @- i/ `
- [root@localhost ~]# popd +1
" s$ [( K: i% B8 z - ~ /usr/share/kde4/apps/kget
% K( F1 z8 } w/ M4 \7 M - [root@localhost ~]# dirs -v
5 D d$ ]8 H* U. T - 0 ~
4 z/ N! Y5 F! ? - 1 /usr/share/kde4/apps/kget
复制代码
- {/ K. K! ]' W- ]9 l1 x" w
2 v7 l u$ w5 v/ a/ v- T, C
说明:可以看到popd不加参数的运行情况: popd把堆栈顶端的目录从堆栈中删除,并切换于位于新的顶端的目录。 说明之二: popd 加有参数 +n时,n 是堆栈中的第n个目录,表示把堆栈中第n个目录从堆栈中删除。 四,多学一点知识
3 K, Q# B' M* V& ]# e1 [1 g
1,pushd和popd都可以只影响堆栈而不切换目录
4 D( o' E( y b/ J
用 -n 参数即可。 看例子:
" u% [% a0 a# H) s7 A, a- [root@localhost ~]# dirs -v
- l! n1 N( O2 S& A* d" F% ]0 u - 0 ~
3 ]% s: i) a( u+ Y1 W# _8 g - 1 /usr/share/kde4/apps/kget
0 U# M. ]" F* a/ ^4 n - [root@localhost ~]# pushd -n /boot/grub
( d6 P' d0 L6 |0 \( j - ~ /boot/grub /usr/share/kde4/apps/kget
9 B+ [2 V. U# L- i( ~' [6 h0 H' _, p - [root@localhost ~]# dirs -v6 P8 b) N3 T; z' Y9 }7 O$ C
- 0 ~
' |( e. u, ?- A- Z% @! _: b - 1 /boot/grub/ a; H0 \, o+ A% P5 Z# T
- 2 /usr/share/kde4/apps/kget
复制代码 7 T: O: V+ o0 ?
! F1 R( U+ S# ]; @, W
, Z$ M0 J; Y$ L. N
2, dirs可以清空目录堆栈 用 -c参数即可 看例子:
. n% W% R1 q& f- [root@localhost ~]# dirs -v- h: j$ M8 W u( v% N
- 0 ~
" \% n4 N( |* S" [% x% W - 1 /boot/grub2 w- |1 p4 t# M
- 2 /usr/share/kde4/apps/kget9 c, [8 h9 L2 L. l* _ u/ b/ N
- [root@localhost ~]# dirs -c$ U& q1 ?! L, D
- [root@localhost ~]# dirs -v: B9 ^. l m2 b( a& n" E# n! r
- 0 ~
复制代码 - V/ m: N4 n, i# o; l
# B, [4 t8 g5 J/ \2 i8 x0 ]
说明: 位于堆栈顶部的目录是当前目录,它不能被pop出去的。 , x0 i) M8 E% N1 }: {4 |% {& q
|