1. 程式人生 > >Linux下如何高效切換目錄?

Linux下如何高效切換目錄?

Linux 下對於目錄的切換,大家肯定會想到一個命令:`cd` 命令。這個是 Linux 下再基本不過的命令,如果這個命令都不知道的話,趕緊剖腹自盡去吧。 cd 命令確實很方便,但如果需要頻繁在下面的目錄切換,你可能要懷疑人生了: ``` /home/alvin/projects/blogdemos/linux-system-programming/thread /home/alvin/projects/blogdemos/diff /home/harry/study/日本文化/中日交流/影視業/動作片 ``` 如果只會 cd 命令的話,那麼就需要不停地 cd ,直到你發瘋。 在這種情況下,我們如何高效進行目錄切換呢?良許給大家介紹三個命令:`pushd` 、 `popd` 、 `dirs` 。 這三個命令其實都是對 `目錄棧` 進行操作,而 `目錄棧` 就是一個儲存目錄的棧結構,**該棧結構的頂端永遠都存放著當前目錄**(敲黑板了,重點!!)。 有程式設計基礎的同學都知道,`棧` 都是遵循著 `後進先出` 的原則。也就是說,在棧結構裡,後面進棧的元素,將先出棧。 複習完基本概念,我們再來詳細這三個命令。 #### 顯示目錄棧內容:dirs 首先是 `dirs` 。這個命令很簡單,就是顯示目錄棧的內容。它有以下三個常用選項: | 選項 | 含義 | | ---- | --------------------------------------------- | | -p | 每行顯示一條記錄 | | -v | 每行顯示一條記錄,同時展示該記錄在棧中的index | | -c | 清空目錄棧 | 其中,`-p` 與 `-v` 選項的區別是,`-v` 選項將顯示每條記錄在棧中的索引,除此之外完全一樣。假如現在有一個目錄棧,我們來看看它裡面有啥內容: ``` [alvin@VM_0_16_centos dir2]$ pwd /home/alvin/test/dir2 [alvin@VM_0_16_centos dir2]$ dirs -v 0 ~/test/dir2 1 ~/test/dir1 2 ~/test/dir3 3 ~/test ``` 請注意,最頂部的元素永遠跟當前目錄一致,如果你在其它目錄下檢視目錄棧,第一個元素將對應發生改變。同理,如果你用後文介紹的 `pushd` 和 `popd` 來操作目錄棧的話,當前目錄將切換到目錄棧的第一個元素對應地址。 如果我們要清空目錄棧,直接使用 `-c` 選項即可。 ``` [alvin@VM_0_16_centos diff]$ dirs -c [alvin@VM_0_16_centos diff]$ dirs -v 0 ~/projects/blogdemos/diff ``` #### 壓入目錄棧:pushd 每次 pushd 命令執行完成之後,預設都會執行一個 dirs 命令來顯示目錄棧的內容。pushd 的用法主要有如下幾種: **1. pushd + 目錄** pushd 後面如果直接跟目錄使用,會切換到該目錄並且將該目錄置於目錄棧的棧頂。例子: ``` [alvin@VM_0_16_centos test]$ pushd dir1 ~/test/dir1 ~/test [alvin@VM_0_16_centos dir1]$ pushd ../dir2 ~/test/dir2 ~/test/dir1 ~/test [alvin@VM_0_16_centos dir2]$ pushd ../dir3 ~/test/dir3 ~/test/dir2 ~/test/dir1 ~/test [alvin@VM_0_16_centos dir3]$ dirs -v 0 ~/test/dir3 1 ~/test/dir2 2 ~/test/dir1 3 ~/test ``` **2. pushd (不帶任何引數)** pushd 不帶任何引數執行的效果就是,將目錄棧最頂層的兩個目錄進行交換。前面我們已經強調過,目錄棧第一個元素與當前目錄是相關的,所以第一個元素髮生改變時,當前目錄將對應切換,反之亦然。 ``` [alvin@VM_0_16_centos dir3]$ dirs -v 0 ~/test/dir3 1 ~/test/dir2 2 ~/test/dir1 3 ~/test [alvin@VM_0_16_centos dir3]$ pwd /home/alvin/test/dir3 [alvin@VM_0_16_centos dir3]$ pushd ~/test/dir2 ~/test/dir3 ~/test/dir1 ~/test [alvin@VM_0_16_centos dir2]$ pwd /home/alvin/test/dir2 #對應目錄發生改變 [alvin@VM_0_16_centos dir2]$ dirs -v 0 ~/test/dir2 1 ~/test/dir3 #索引 0 和 1 的內容對調 2 ~/test/dir1 3 ~/test ``` **3. pushd +/-n ** pushd +/-n 就是直接切換到對應索引值的目錄。注意,這裡既可以用加號,也可以用減號。如果是加號的話,將從目錄棧由上往下數,而用減號的話,將從目錄棧由下往上數。 接下來就回到了我們本文開頭的問題,如果我們要在兩個或多個路徑很長的目錄之間頻繁切換,該如何操作? 首先,我們用 **pushd + 目錄** 的方式將這幾個路徑新增到目錄棧中; 然後,再用 **pushd +/-n** 在不同的目錄間快速切換。具體演示如下: ``` [alvin@VM_0_16_centos dir2]$ pwd /home/alvin/test/dir2 [alvin@VM_0_16_centos dir2]$ dirs -v 0 ~/test/dir2 1 ~/test/dir3 2 ~/test/dir1 3 ~/test [alvin@VM_0_16_centos dir2]$ pushd +2 ~/test/dir1 ~/test ~/test/dir2 ~/test/dir3 [alvin@VM_0_16_centos dir1]$ pwd /home/alvin/test/dir1 [alvin@VM_0_16_centos dir1]$ dirs -v 0 ~/test/dir1 1 ~/test 2 ~/test/dir2 3 ~/test/dir3 ``` #### 彈出目錄棧:popd 每次 popd 命令執行完成之後,預設都會執行一個 dirs 命令來顯示目錄棧的內容。popd 的用法主要有如下幾種: **1. popd (不帶任何引數)** popd不帶任何引數執行的效果,就是將目錄棧中的棧頂元素出棧。這時,棧頂元素髮生變化,自然當前目錄也會發生相應的切換。 ``` [alvin@VM_0_16_centos dir3]$ dirs -v 0 ~/test/dir3 1 ~/test/dir1 2 ~/test 3 ~/test/dir2 [alvin@VM_0_16_centos dir3]$ popd ~/test/dir1 ~/test ~/test/dir2 [alvin@VM_0_16_centos dir1]$ dirs -v 0 ~/test/dir1 1 ~/test 2 ~/test/dir2 ``` **2. popd +/-n** 將目錄棧中的第n個元素刪除。同樣的,加減號表示從上往下數,還是從下往上數。 ``` [alvin@VM_0_16_centos dir1]$ dirs -v 0 ~/test/dir1 1 ~/test 2 ~/test/dir2 [alvin@VM_0_16_centos dir1]$ popd +1 ~/test/dir1 ~/test/dir2 [alvin@VM_0_16_centos dir1]$ dirs -v 0 ~/test/dir1 1 ~/test/dir2 ``` --- 公眾號:良許Linux ### 有收穫?希望老鐵們來個三連擊,給更多的人看到這