linux用命令行快速切換目錄

和很多人一樣,我也是在電腦前度過一天的大部分時間。爲了提高效率(並且不讓我的身體有太多的抱怨),我試着建立一個優化的環境。例如,我使用Vim寫代碼,使用Vimperator瀏覽網頁,使用 i3 窗口管理器。其他日常事情就是文件系統導航(從一個目錄切換到另一個目錄——譯者注)。我更喜歡使用命令行來,但是一遍又一遍的輸入 cd ~/some/very/deep/often-used/directory 變得很麻煩。

像autojump、z 和 fasd 這樣的自動工具,通過提供一個指向你常用文件夾的快捷方式來處理這個問題。就我個人來說,我希望有一個更加手動的方法,我將這個方法向大家分享。我發現用這個方法後,效率有很大的提高,並且希望你們也能提高效率。

使用符號鏈接跳轉

實際上這個手工解決方案總結起來是在一個隱藏文件夾下(例如 ~/.marks)儲存符號鏈接.這裏有4個shell函數:jump, mark, unmark, 和marks:

  1. export MARKPATH=$HOME/.marks 
  2. function jump { 
  3.     cd -P "$MARKPATH/$1" 2>/dev/null || echo "No such mark: $1" 
  4. function mark { 
  5.     mkdir -p "$MARKPATH"; ln -s "$(pwd)" "$MARKPATH/$1" 
  6. function unmark { 
  7.     rm -i "$MARKPATH/$1" 
  8. function marks { 
  9.     ls -l "$MARKPATH" | sed 's/  / /g' | cut -d' ' -f9- | sed 's/ -/\t-/g' && echo 

將它們放在你的.zshrc或.bashrc 文件,你就可以開始跳轉了(Mac OS X用戶需要一個稍微有些不同的makes函數版本,請見下方)。我也把這轉換成了一個叫做jump的oh-my-zsh插件,但是這玩意目前還在pull-request。爲了添加一個新書籤,cd到目錄然後使用一個你喜歡的名字標記上它。

  1. $ cd ~/some/very/deep/often-used/directory 
  2. $ mark deep 

這段文字將在目錄~/.marks中添加一個叫做deep的符號鏈接。跳轉到這個目錄,在文件系統中的任何地方輸入以下命令。

  1. $ jump deep 

移除標籤(即符號鏈接),輸入:

  1. $ unmark deep 

你可以通過輸入如下指令來瀏覽所有的標籤

  1. $ marks 
  2.   
  3. deep    -> /home/johndoe/some/very/deep/often-used/directory 
  4. foo     -> /usr/bin/foo/bar 

沒了

添加tab補齊

爲了給jump和unmark函數添加Tab補齊,添加如下代碼到.zshrc中(感謝tiziano88):

  1. function _completemarks { 
  2.   reply=($(ls $MARKPATH)) 
  3.   
  4. compctl -K _completemarks jump 
  5. compctl -K _completemarks unmark 

或者添加如下代碼到.bashrc中(感謝microcolonl)

  1. _completemarks() { 
  2.   local curw=${COMP_WORDS[COMP_CWORD]} 
  3.   local wordlist=$(find $MARKPATH -type l -printf "%f\n") 
  4.   COMPREPLY=($(compgen -W '${wordlist[@]}' -- "$curw")) 
  5.   return 0 
  6.   
  7. complete -F _completemarks jump unmark 

現在如果你輸入jump或者unmark 然後回車,你會看見一個所有可用的標籤.碉堡了!

給Mac OS X>用戶:

如guygurari指出的,Mac OS X用戶需要一個稍微有些不同的makes函數版本:

  1. function marks { 
  2.     \ls -l "$MARKPATH" | tail -n +2 | sed 's/  / /g' | cut -d' ' -f9- | awk -F ' -> ' '{printf "%-10s -> %s\n", $1, $2}' 

譯者注:

此功能Windows下也可以實現。做4個批處理 :jump.bat、mark.bat、unmark.bat、marks.bat。每個BAT的內容如下:

jump.bat:

  1. @echo off 
  2. set MARKPATH=%~dp0.marks 
  3. if [%1]==[] goto err 
  4. if not exist "%MARKPATH%/%1" (echo "No such mark: %1") else cd "%MARKPATH%/%1" 
  5.   
  6. :err 
  7. echo Type a mark, please. 

mark.bat

  1. @echo off 
  2. set MARKPATH=%~dp0.marks 
  3. set TAR=%cd% 
  4. if not exist %MARKPATH% ( goto makedir ) else ( goto makelink ) 
  5.   
  6. :makedir 
  7. md %MARKPATH% 
  8. attrib +h %MARKPATH% 
  9. goto makelink 
  10.   
  11. :makelink 
  12. cd %MARKPATH% 
  13. mklink /j %1 %TAR% 
  14. cd %TAR% 

unmark.bat

  1. @echo off 
  2. set MARKPATH=%~dp0.marks 
  3. rd %MARKPATH%\%1 

marks.bat

  1. @echo off 
  2. set MARKPATH=%~dp0.marks 
  3. echo mark list: 
  4. dir /b %MARKPATH% 

將4個BAT都放在系統環境變量%PATH%中任意一個目錄下,或者將bat文件所在目錄添加進%PATH%中就行了。因爲Window在 vista/win7在引入這個功能,因此只能在vista/win7以上的系統中使用。還有一點不一樣的是,鏈接文件保存在bat文件所在目錄下 的.marks隱藏文件夾下,而不是某個系統文件夾,這樣在刪除的時候也不用亂找了。

使用的時候和上述描述一樣,使用如下命令:

跳轉:

  1. jump markname 
  2. mark markname 
  3. unmark markname 
  4. marks 

就是marks的功能就沒有那麼強了。。。

原文鏈接:http://jeroenjanssens.com/2013/08/16/quickly-navigate-your-filesystem-from-the-command-line.html

譯文鏈接:http://blog.jobbole.com/46258/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章