用命令行在文件系统中快速导航


2013-8-18更新: 感谢Hacker News的讨论中很多有用的建议,我添加了(1)代码的引用,(2)Tab补齐的章节,和(3) 给Mac OS X用户的注释。

跟很多人一样,我在电脑度过一天的大部分时间。为了提高效率(并且不让我的身体有太多的抱怨)我试着建立一个优化的环境.例如,我使用Vim写代码,使用Vimperator浏览网页,使用i3窗口管理器。其他的日常是文件系统导航(从一个目录切换到另一个目录——译者注)。我更喜欢使用命令行来实现,但是一遍又一遍的输入cd ~/some/very/deep/often-used/directory 变得很麻烦.

autojumpz,和fasd 通过提供一个指向你常用文件夹的快捷方式来处理这个问题.就我个人来说,我希望有一个更加手动的方法,我将这个方法向大家分享。我注意到使用这个方法效率有很大的提高,并且希望你们也能提高效率。

使用符号链接跳转 实际上这个手工解决方案总结起来是在一个隐藏文件夹下(例如~/.marks)储存符号链接.这里有4个shell函数: jump, mark, unmark,和marks:

export MARKPATH=$HOME/.marks  
function jump {   
    cd -P "$MARKPATH/$1" 2>/dev/null || echo "No such mark: $1"  
}  
function mark {   
    mkdir -p "$MARKPATH"; ln -s "$(pwd)" "$MARKPATH/$1"  
}  
function unmark {   
    rm -i "$MARKPATH/$1"  
}  
function marks {  
    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到目录然后使用一个你喜欢的名字标记上它。

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

这段文字将在目录~/.marks中添加一个叫做deep的符号链接。跳转到这个目录,在文件系统中的任何地方输入以下命令。

$ jump deep   

移除标签(即符号链接),输入:

$ unmark deep  

你可以通过输入如下指令来浏览所有的标签

$ marks  

deep   -> /home/johndoe/some/very/deep/often-used/directory  
foo    -> /usr/bin/foo/bar 

就是这样了

添加tab补齐 为了给jump和unmark函数添加Tab补齐,添加如下代码到.zshrc中(感谢tiziano88):

function _completemarks {  
 reply=($(ls $MARKPATH))  
}  

compctl -K _completemarks jump  
compctl -K _completemarks unmark  

或者添加如下代码到.bashrc中(感谢microcolonel)

_completemarks() {  
  local curw=${COMP_WORDS[COMP_CWORD]}  
  local wordlist=$(find $MARKPATH -type l -printf "%f\n")  
  COMPREPLY=($(compgen -W '${wordlist[@]}' -- "$curw"))  
  return 0  
}  

complete -F _completemarks jump unmark 

现在如果你输入jump或者unmark 然后回车,你会看见一个所有可用的标签.碉堡了!

给Mac OS X用户: 如guygurari指出的,Mac OS X用户需要一个稍微有些不同的makes函数版本:

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

如果你喜欢我所讲的东西,你可能想在Twitter上follow我

译者注: 此功能Windows下也可以实现。做4个批处理:jump.bat,mark.bat,unmark.bat,marks.bat。每个BAT的内容如下:

jump.bat:

@echo off  
set MARKPATH=%~dp0.marks  
if [%1]==[] goto err  
if not exist "%MARKPATH%/%1" (echo "No such mark: %1") else cd "%MARKPATH%/%1"  

:err  
echo Type a mark, please.

mark.bat

@echo off  
set MARKPATH=%~dp0.marks  
set TAR=%cd%  
if not exist %MARKPATH% ( goto makedir )else ( goto makelink )  

:makedir  
md %MARKPATH%  
attrib +h %MARKPATH%  
goto makelink  

:makelink  
cd %MARKPATH%  
mklink /j %1 %TAR%  
cd %TAR%  

unmark.bat

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

marks.bat

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

将4个BAT都放在系统环境变量%PATH%中任意一个目录下,或者将bat文件所在目录添加进%PATH%中就行了。因为Window在vista/win7在引入这个功能,因此只能在vista/win7以上的系统中使用。还有一点不一样的是链接文件保存在bat文件所在目录下的.marks隐藏文件夹下,而不是某个系统文件夹,这样在删除的时候也不用乱找了。

使用的时候和上述描述一样,使用如下命令: 跳转:

jump markname
mark markname
unmark markname
marks

就是marks的功能就没有那么强了…

评论!

社交