天天看點

Linux小技巧_pushd/popd/dirs

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.例子:

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

繼續閱讀