在运维的时候,需要经常 cd 到指定的位置去查日志、改代码,我常常无法忍受一些人那缓慢的打字速度,还经常输入错误,为什么不用用这个 20 行代码的工具呢?
将下列代码保存成 /path/to/m.sh 然后在 .bashrc 里 source /path/to/m.sh ,就可以使用了。
0)m + 将当前路径保存为以最后一级目录名称为书签;
1)m +foo 将当前路径保存为名称为 foo 的书签,注意加号和名称之间没有空格;
2)m -foo 删除名为 foo 的书签,注意减号号和名称之间没有空格;
3)m foo 跳转;
4)m 列出所有书签;
5)m /bar 搜索名字匹配 bar 的书签;
代码如下:
# bash directory bookmark
function cd_mark() {
MARKPATH="${MARKPATH:-$HOME/.local/share/marks}"
[ -d "$MARKPATH" ] || mkdir -p -m 700 "$MARKPATH" 2> /dev/null
case "$1" in
+*) # m +foo - add new bookmark for $PWD
ln -snf "$(pwd)" "$MARKPATH/${1:1}"
;;
-*) # m -foo - delete a bookmark named "foo"
rm -i "$MARKPATH/${1:1}"
;;
/*) # m /bar - search bookmarks matching "bar"
find "$MARKPATH" -type l -name "*${1:1}*" | \
awk -F "/" '{print $NF}' | MARKPATH="$MARKPATH" xargs -I'{}'\
sh -c 'echo "{} ->" $(readlink "$MARKPATH/{}")'
;;
"") # m - list all bookmarks
command ls -1 "$MARKPATH/" | MARKPATH="$MARKPATH" xargs -I'{}' \
sh -c 'echo "{} ->" $(readlink "$MARKPATH/{}")'
;;
*) # m foo - cd to the bookmark directory
local dest="$(readlink "$MARKPATH/$1" 2> /dev/null)"
[ -d "$dest" ] && cd "$dest" || echo "No such mark: $1"
;;
esac
}
# by default, alias cd_mark to m
alias ${MARKCMD:-m}='cd_mark'
我使用过后觉得超级实用,甚至比 zsh 中的 z 跳转还要好用,部署相当简单。