cd 增强版

简介: cd 增强版 zsh 的 cd 有个很吸引我的特性:比如你在 ~/data/foo/horrible/dir/names 目录下,需要切换到 ~/data/bar/horrible/dir/names,只需执行: % pwd ~/data/foo/horrible/dir/names % cd foo bar % pwd ~/data/bar/horrible/dir/name

cd 增强版

zsh 的 cd 有个很吸引我的特性:比如你在 ~/data/foo/horrible/dir/names 目录下,需要切换到 ~/data/bar/horrible/dir/names,只需执行:

% pwd
~/data/foo/horrible/dir/names
% cd foo bar
% pwd
~/data/bar/horrible/dir/names

我的工作环境是 AIX 5.3,有多套开发环境,经常需要做这样的切换。一开始上面只有最原始的 c shell,因为权限问题,费了很大劲编译出了 bash,zsh 到现在还编不出来,呵呵。所以就自己动手增强一下 cd 命令。增强的功能有:

  1. 诸如 zsh 路径替换的功能;
  2. 支持短名(自动模式匹配),比如要进入 workspace/shell/curl,就输入 cd w/s/c,效果等价于 cd *w*/*s*/*c*。如果有多个路径同时匹配,就将他们全部输出到屏幕;
  3. 简写支持 CDPATH。使用相对路径时,如果当前目录下没找到匹配的路径,就到 CDPATH 下逐一检查。

因为我默认在短命的两头都加上了 *,你可以修改 $i = "*"$i"*" 这一句,改成符合你自己习惯的匹配方式,比如 $i = $i"*",值匹配开头~

cd () { if [ $# -eq 0 ]; then command cd return $(true) elif [ $# -eq 1 ]; then if { command cd "$1" 2>/dev/null; }; then return $(true) fi cd_path_pattern=`echo "$1" | awk -F/ -v OFS=/ '{ for (i = 1; i <= NF; i++) { if ($i != "" && $i != "." && $i != ".." && index($i, "*") == 0) { $i = "*"$i"*" } } print $0 }'` if [ -z "$cd_path_pattern" ]; then unset cd_path_pattern return $(false) fi set $cd_path_pattern if [ $# -eq 1 -a "$1" != "$cd_path_pattern" ]; then command cd "$1" unset cd_path_pattern return $(true) elif [ $# -gt 1 ]; then # ignore file cd_path_dir_cnt=`file $cd_path_pattern | sed -n '/: directory/{s///; p}' | wc -l` if [ $cd_path_dir_cnt -eq 1 ]; then command cd `file $cd_path_pattern | sed -n '/: directory/{s///; p}'` unset cd_path_pattern unset cd_path_dir_cnt return $(true) elif [ $cd_path_dir_cnt -gt 1 ]; then file $cd_path_pattern | sed -n '/: directory/{s///; p}' >&2 unset cd_path_pattern unset cd_path_dir_cnt return $(false) fi fi pattern_with_cd_path=$(echo "$CDPATH" | sed 's/://n/g' | awk -F: '$0 && !a[$0]++' | while read pp; do pp=`echo "$pp/$cd_path_pattern" | sed "s#//+#/#g"` set $pp if [ $# -eq 1 -a "$1" != "$pp" ]; then echo "$1" >&1 break elif [ $# -gt 1 ]; then cd_path_dir_cnt=`file $pp | sed -n '/: directory/{s///; p}' | wc -l` if [ $cd_path_dir_cnt -eq 1 ]; then file $pp | sed -n '/: directory/{s///; p}' >&1 break; elif [ $cd_path_dir_cnt -gt 1 ]; then file $pp | sed -n '/: directory/{s///; p}' >&2 break fi fi done) if [ ! -z "$pattern_with_cd_path" ]; then command cd "$pattern_with_cd_path" fi unset pattern_with_cd_path unset cd_path_pattern else command cd `pwd | sed "s/$1/$2/g"` fi }

返回多层父目录

另外,还有一个方便的返回上层目录的函数配合使用:

.. () { if [ $# -eq 0 ] || [ $1 -le 0 ]; then cd_parent_cnt=1 else cd_parent_cnt=$1 fi while [ $cd_parent_cnt -gt 0 ] && [ "$PWD" != "/" ]; do command cd .. cd_parent_cnt=`expr $cd_parent_cnt - 1` done unset cd_parent_cnt }

有些朋友定义了一个别名 alias ..='cd ..',不过在返回多层目录时感觉并没有方便多少。用上面的函数,如果要返回上 5 层,就执行 .. 5 即可。


版权声明

为方便其他朋友提问和指正,转载是请保持文章完整性,并以超链接形式注明原始作者“redraiment ”和主站点 地址,谢谢。

联系方式

我的邮箱,欢迎来信(redraiment@gmail.com
我的Blogger(子清行 ):http://redraiment.blogspot.com/
我的Google Sites(子清行 ):https://sites.google.com/site/redraiment
我的CSDN博客(梦婷轩 ):http://blog.csdn.net/redraiment
我的百度空间(梦婷轩 ):http://hi.baidu.com/redraiment

目录
相关文章
|
6月前
|
存储 JSON 分布式计算
MongoDB【部署 01】mongodb最新版本6.0.5安装部署配置使用及mongodb-shell1.8.0安装使用(云盘分享安装文件)
MongoDB【部署 01】mongodb最新版本6.0.5安装部署配置使用及mongodb-shell1.8.0安装使用(云盘分享安装文件)
338 0
|
Linux Apache
Apache Doris集群模式快速体验之CentOS7安装(1)2
Apache Doris集群模式快速体验之CentOS7安装(1)2
196 0
|
Linux Shell 网络安全
Apache Doris集群模式快速体验之CentOS7安装(1)3
Apache Doris集群模式快速体验之CentOS7安装(1)3
237 0
|
存储 固态存储 Linux
Apache Doris集群模式快速体验之CentOS7安装(1)1
Apache Doris集群模式快速体验之CentOS7安装(1)1
183 0
|
存储 关系型数据库 Linux
在Centos7环境下进行搭建postgresql-xl集群环境
在Centos7环境下进行搭建postgresql-xl集群环境
145 0
在Centos7环境下进行搭建postgresql-xl集群环境
|
SQL 关系型数据库 MySQL
Centos7在线安装CDH5
Centos7在线安装CDH5
321 0
|
SQL 关系型数据库 MySQL
云端Centos 04 安装新版MySQL8
目录 Option1 下载server完整的RPM包进行安装,最后失败了 继续后有发现软件冲突和无底洞的未知依赖 Option2 好吧,重新来过,通过yum来安装 下载一个RedHat/Linux7的rpm包 执行下面命令安装 使用MySQL 执行下一个命令初始化mysql ok, mysqld进程跑起来了 使用MySQL MySQL8 第一次登录需要修改用户密码 编写MySQL HelloWorld
154 0
云端Centos 04 安装新版MySQL8
|
消息中间件 缓存 NoSQL
云端Centos 02 安装新版Redis6
简单理解就是缓存,也可以当做数据库,消息队列来用。知道概念,本文的重点是安装使用。
102 0
云端Centos 02 安装新版Redis6
|
XML JavaScript 数据可视化
免内置mysql和客户端媒体的kbengine demo,kbengine通用版
关键字:kbengine换外部mysql数据源和外部客户端托管地址,kbengine js demo外部托管 黑屏,kbengine外置mysql
278 0
免内置mysql和客户端媒体的kbengine demo,kbengine通用版
|
NoSQL Shell PHP
CentOS6.9安装mongodb和php-mongodb扩展
这篇笔记记录了在CentOS6.9中使用二进制包安装mongodb和源码编译php-mongodb扩展的过程,并附上了mongodb的启动脚本
1585 0