cd,敢问路在何方

缘起

nix系统中,shell命令就是你的工具箱,它可以帮助你完成各种各样的任务。于是就有人好奇,平常用的最多的命令是啥啊?于是乎,某命令就出现了

$ history | awk '{CMD[$2]++;count++;} END { for (a in CMD )print CMD[a] \
$ " " CMD[a]/count*100 "% " a }' | grep -v "./" | column -c3 -s " " -t | \
$ sort -nr | nl | head -n10
1    295  29.5%  ls
2    189  18.9%  cd
3    133  13.3%  vim
4    96   9.6%   python
5    59   5.9%   exit
6    33   3.3%   df
7    26   2.6%   history
8    25   2.5%   sudo
9    17   1.7%   rm
10   14   1.4%   clear

瞧,这就是我的命令使用情况,cd排名第二。看来在nix寻路是一件再平常不过的事情了。于是乎,敢问路在何方?

cd以及相关命令

要想到某个目录,直接cd命令就可以了,而且cd命令还支持绝对路径和相对路径。但是,但是,每次都要在几个目录里跳来跳去,烦啊

预定义命令

shell预定义了一些命令,可以方便的进行一下跳转,比如

cd -           #回到上一次目录
cd ~           #回到当前根目录
cd ~vagrant    #回到vagrant用户的根目录

$ cp file.txt /some/annoyingly/deep/target/directory/other.txt
$ cd !$:h         #这个其实是shell命令对参数的处理了,有空细说
$ pwd # => /some/annoyingly/deep/target/directory

alias的妙用

通过alias命令,可以自己设定一些快捷命令,很方便的进行目录的跳转。比如最烦的就是跳转到上层目录,上上层目录,上上上层目录,上上…层目录。通过设定alias,这种问题可以很方便的解决

alias cd1="cd .."
alias cd2="cd ../.."
alias cd3="cd ../../.."
alias cd4="cd ../../../.."
alias cd5="cd ../../../../.."

dirs、pushd、popd

有时候会在几个目录之间不停的来回跳转,何不把目录栈存放起来呢,这就是这几个命令的用处了

$dirs           #显示目录栈,第一条记录为当前目录,没有存放在栈中
$pushd .        #把当前目录压栈
$pushd /dev     #把当前目录压栈,并跳转到/dev目录
$popd           #出栈,并跳转到出栈的目录

目录跳转神器(autojump, z, j2)

个人猜测,根据8:2原则,80%的cd命令只跳转到20%的常用目录中,20%的cd命令跳转到80%的不常用目录中。既然这样,为啥不把所有cd的目录存放起来,然后做一些分析,这样岂不是更容易了?于是乎,某贴出现了

Hacker News某人发了一个帖子,讲了一些unix trick的用法,其中提到了j.py

‘j.py’ http://tiny.cc/62qjow remembers your most used folders and is an incredible substitute to browse directories by name instead of ‘cd’

HN评论里有人不满意了,于是又出来一个玩意

Use z (https://github.com/rupa/z), not j.py.

后来我翻了翻github,才明白,这些玩意的祖宗叫autojump,python+shell写的一个目录跳转神器

整理一下:

祖宗:autjump
第一代儿子:j
第二代儿子:shell版本 z
第二代儿子:python版本 j2.py

至于怎么用,神器还是值得自己研究的

神器后的幸福生活

自从用上了z/j2.py后,妈妈再也不担心我迷路了,因为神器在手,条条大路通罗马