情景linux--如何擺脫深路徑的頻繁切換煩惱?

weixin_33728268發表於2017-06-01

情景

通常情況下,在linux系統上切換目錄的成本很低,使用cd命令就可以了。如果需要在一個目錄的不同的子目錄和其父目錄之間切換,進入到這個目錄之後,再使用相對路徑會比較方便。如果要切換的目錄的路徑較淺,那使用絕對路徑也未嘗不可。

但是,如果需要頻繁在兩個以上的深路徑的目錄裡切換,無論使用相對路徑還是絕對路徑,切換目錄都會比較耗時,嚴重影響你工作的效率。

有沒有什麼好方法呢?

方案

為了方便舉例,我們在當前使用者的根目錄下建立一個目錄dir_test,然後進入到該目錄下。

$ pwd
/home/j-tester/dir_test

再在這個目錄下建立幾個路徑較深的目錄:

$ mkdir -p 1/11/111/1111/11111 2/22/222/2222/22222 3/33/333/3333/33333 4/44/444/4444/44444

為了方便演示和說明,故意將每個目錄的名稱都設定為數字,且根據層次依次增加數字的位數。實際情景下遇到的長路徑無論是目錄名稱的長度還是每層目錄下的子目錄數量都比本例要複雜得多的。

檢視一下這些個目錄:

$ ls -l */*/*/*/*
1/11/111/1111/11111:
總用量 0

2/22/222/2222/22222:
總用量 0

3/33/333/3333/33333:
總用量 0

4/44/444/4444/44444:
總用量 0

兩個目錄

如果只需要在兩個目錄之間切換,無論目錄的路徑長短,使用cd -(切換到上一個目錄)應該是最高效的。

比如,只需要在1111133333兩個目錄之間切換:

先進入11111目錄,再進入33333目錄,此時執行cd -就進入了11111目錄。再執行cd -就又回到了33333目錄,如此反覆。並且cd -執行後會輸出當前所在的目錄。

$ cd /home/j-tester/dir_test/1/11/111/1111/11111
$ pwd
/home/j-tester/dir_test/1/11/111/1111/11111
$ cd /home/j-tester/dir_test/3/33/333/3333/33333
$ pwd
/home/j-tester/dir_test/3/33/333/3333/33333
$ cd -
~/dir_test/1/11/111/1111/11111
$ cd -
~/dir_test/3/33/333/3333/33333
$ cd -
~/dir_test/1/11/111/1111/11111

是不是很方便?但務必注意,它只能記住上一個目錄是什麼,所以如果在兩個目錄之間切換它剛好適用。當需要在更多的目錄裡切換時,它就Hold不住了。

軟連結

linux系統下可以建立軟連結,相當於windows下的快捷方式。

使用軟連結的方式可以從一定程度上降低切換目錄的成本,但也有著明顯的缺點:

  1. 如果實現n個目錄的自由切換,需要建立n*(n-1)個軟連結,這樣看來,似乎僅當n=2時工作量還可以接受;
  2. 切換別的目錄時,還需要重新建立軟連結;
  3. 建立軟連結畢竟需要對目錄內容進行了改變,這往往不是預期的效果;

所以,介紹軟連結用於切換目錄只是提供一種思路而已。

目錄棧命令

但凡是切換目錄的場景,目錄棧命令都hold住

目錄棧命令共有三個:pushd、popd、dirs。

要想熟練使用這三個命令,首先要理解什麼是目錄棧。

目錄棧

目錄棧是使用者最近訪問過的系統目錄的列表(和環境變數DIRSTACK內容相對應),並以堆疊的形式管理,列表中的每一項都是絕對路徑

dirs

dirs命令的結果顯示當前目錄棧中的所有記錄。預設情況下的目錄棧是當前目錄。

dirs
~
cd dir_test
dirs
~/dir_test ~

進入到dir_test目錄後執行dirs,結果首先是當前目錄,其次是進入dir_test之前的目錄棧內容。這說明了,cd dir_test的操作是除了進入目錄之外,還將dir_test這個目錄加入到了目錄棧中。目錄棧的最左端是棧頂,最右端是棧底。

用法:

dirs [+N] [-N] [-cplv]

引數說明:

+N   將第N個目錄顯示出來(從左邊棧頂數起,數字從0開始)
-N   將第N個目錄顯示出來(從右邊棧底數起,數字從0開始)
-c   刪除目錄棧中的所有記錄
-l   以完整格式顯示(預設情況下當前使用者的根路徑用~表示)
-p   每行一個目錄來顯示目錄棧的內容
-v   每行一個目錄來顯示目錄棧的內容,每個目錄前加上的編號,從0開始

pushd

pushd的作用是將目錄加入到目錄棧的頂部,並切換到該目錄。

不帶引數執行時,效果是互換目錄棧頂部的前兩個目錄的位置,也就實現了在棧頂的最上面兩個目錄之間切換。

用法:

pushd [-n] [+N] [-N]
pushd [-n] [dir]

引數說明:

-n   將目錄入棧時,不切換目錄
+N   將第N個目錄移至棧頂(從左邊棧頂數起,數字從0開始)
-N   將第N個目錄移至棧頂(從右邊棧底數起,數字從0開始)

popd

popd的用途是刪除目錄棧中的記錄。
不帶引數執行時將刪除目錄棧頂部的目錄,然後切換到新的棧頂元素所指向的目錄。
用法:

 popd [-n] [+N] [-N]

引數說明:

+N   將第N個目錄刪除(從左邊棧頂數起,數字從0開始)
-N   將第N個目錄刪除(從右邊棧底數起,數字從0開始)
-n   將目錄出棧時,不切換目錄

三個命令都有+N和-N的引數,且規則一致,為了避免混淆,記住一個方向即可:

自頂(棧頂、左邊)向下(棧底、右邊)是正道(正號、+N)

建立別名

實際使用時還可以為pushd和popd設定別名,比如:

alias p1="pushd +1"
alias p2="pushd +2"
alias pp1="popd +1"
alias pp2="popd +2"

可根據自己的實際需求定製。

目錄棧命令用起來非常靈活,也非常便利。

擴充套件知識

  1. 快捷目錄-
  2. 軟連結
  3. 目錄棧及命令

相關文章