菜鸟有一个关于改变目录的需求,怎么实现啊

sh/bash/dash/ksh/zsh等Shell脚本
awu
帖子: 11
注册时间: 2005-12-23 14:45

菜鸟有一个关于改变目录的需求,怎么实现啊

#1

帖子 awu » 2010-08-16 22:49

问题如下:
我有不确定名字的目录无数个:A,B,C,D,等等,这些目录都会很深,而且放的地方也不尽相同,比如A可能放在home下,B可能放在home/version1/下,等等;所做的常规性的操作之一就是进入一个很深的地方后,要再退回到A下,或B下,etc。。。这样我经常cd ..半天才能退出来。。。。

但这些目录有一个共同的特征就是无论是A还是B还是C等,它们的子目录和结构都是基本相同的,所有都能在它们下面找到一个相同的目录X,而且别的地方没有。

能不能写一个脚本,从任意深的地方一下子退到A或B或C下?只要判断X存在就可以了。

尝试了一天了也搞不定,主要是不会改变目录。。。在脚本中调用cd ..或都cd <绝对路径>都对当前console中shell的提示符没有任何影响啊?我也尝试了设置PWD变量,也没有用。。。
不知道有没有什么好办法?或都我的办法有问题? :em06
头像
qiang_liu8183
论坛版主
帖子: 10701
注册时间: 2006-09-10 22:36
系统: Arch Debian
来自: 北京

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#2

帖子 qiang_liu8183 » 2010-08-16 23:27

换zsh
干不了大事就把小事干的大气点
awu
帖子: 11
注册时间: 2005-12-23 14:45

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#3

帖子 awu » 2010-08-17 1:39

这个。。。。bash是俺的工作环境中强制使用的,换不了。。。
zsh能实现上面的功能?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#4

帖子 eexpress » 2010-08-17 8:34

别信zsh。那也是嘛都要自己动手的。在bash,你的支持很多。

你这要求,大概pushd popd就可以。常用的深目录,直接alias一个命令也可以。
如果目录位于固定位置,设置cdpath更方便,直接cd xx<tab>就可以补全。

从X特征目录来说。
你简单的locate X 就是。可以从这点,写一个脚本(比如 cdx.bash)。显示locate结果,然后提示选择数字,固定跳转到这ABCD几个目录。
● 鸣学
头像
link_01
帖子: 1024
注册时间: 2008-11-05 13:24

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#5

帖子 link_01 » 2010-08-17 9:27

看你的描述,A/B都是接近顶级目录, 很深的话试试重新cd A/B, 替换跳出目录
笔记
-------------------------------------
http://blog.163.com/wqt_1101
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#6

帖子 gzbao9999 » 2010-08-17 10:13

代码: 全选

vava@vava:/usr/local/bin$ more showXmother 
#!/bin/bash
#find这行 根据实际情况自行修改
find ~/ -name target -type d|grep -Po '^.*/'> ~/.mytemptemp;         
cat -n ~/.mytemptemp;

代码: 全选

vava@vava:/usr/local/bin$ more mycd
#!/bin/bash
cd `sed -n $1p ~/.mytemptemp`;
两个都丢在/usr/local/bin/下 chmod a+x

用的时候
先在命令行中执行 showXmother
根据内容中的行号
输入 source mycd n (n代表行号) (输入 . mycd n也可以)
气血鼓荡,身体发胀,偶飘上头,三时舒畅
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#7

帖子 eexpress » 2010-08-17 10:42

千年不动的目录,居然用find。。。。不是找麻烦嘛。
用locate
● 鸣学
awu
帖子: 11
注册时间: 2005-12-23 14:45

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#8

帖子 awu » 2010-08-17 13:55

eexpress 写了:别信zsh。那也是嘛都要自己动手的。在bash,你的支持很多。

你这要求,大概pushd popd就可以。常用的深目录,直接alias一个命令也可以。
如果目录位于固定位置,设置cdpath更方便,直接cd xx<tab>就可以补全。

从X特征目录来说。
你简单的locate X 就是。可以从这点,写一个脚本(比如 cdx.bash)。显示locate结果,然后提示选择数字,固定跳转到这ABCD几个目录。
实际上我这个脚本是不针对常用目录的,因为可能会有无数个人用,每个人把这些目录起的名字会五花八门(只是这些目录下的子目录结构相同),放在地方也会五花八门。。。所以我只是想求一个能在bash脚本里改变shell当前目录的办法。
谢谢楼上各们啊啊啊 :em03
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#9

帖子 trigger » 2010-08-17 14:12

~$ curr=`pwd`
~$ cd srclip/work/adir/
~/srclip/work/adir$ cd $curr
~$
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#10

帖子 aerofox » 2010-08-17 23:15

写了个脚本,把它 source 之后应该就可以实现楼主要的功能了,但是要是我自己用,我不希望在 cd 命令中自动执行 update_cd_cache,因为这太费时了。脚本如下:

代码: 全选

#!/bin/bash
CD_CACHE_FILE=~/.cd_cache
function update_cd_cache()
{
    CD_SEARCH_ROOT=/home
    echo "Update cd cache file..." 1>&2
    find "$CD_SEARCH_ROOT" -type d -name X -printf "%h\n" -prune > $CD_CACHE_FILE 2> /dev/null
}

function cd()
{
    if ! command cd "$@" 2> /dev/null; then
	if [[ ! -f "$CD_CACHE_FILE" ]]; then
	    update_cd_cache
	elif [[ -r "$CD_CACHE_FILE" ]]; then
	    local cd_targ="${@:0-1}"
	    retval=
	    while read cache_dir; do
		if [[ "${cache_dir##*/}" == "$cd_targ" ]]; then
		    command cd "$cache_dir"
		    retval=$?
		    break
		fi
	    done < "$CD_CACHE_FILE"
	    if [[ -z "$retval" ]]; then
		update_cd_cache
		while read cache_dir; do
		    if [[ "${cache_dir##*/}" == "$cd_targ" ]]; then
			command cd "$cache_dir"
			retval=$?
			break
		    fi
		done < "$CD_CACHE_FILE"
	    fi
	    [[ -z "$retval" ]] && echo "cd: $cd_targ: No such directory" 1>&2
	    return ${retval:-2}
	fi
    fi
}
头像
冲浪板
论坛版主
帖子: 7513
注册时间: 2007-05-06 8:19

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#11

帖子 冲浪板 » 2010-08-17 23:20

lz开黑窗口,然后开鹦鹉螺(是这个吧?),然后拉文件夹到黑窗口....
在win里就是那么用的说
头像
davidlone
帖子: 626
注册时间: 2007-03-06 18:14
来自: 常德--重庆

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#12

帖子 davidlone » 2010-08-17 23:41

来学习的,顺便围观05年的潜水艇。
ABIT Rocket AV8 ,AMD3500,创见DDR433 1GB,希捷IDE250GB,MSI6200a,7130电视卡,Archlinux
awu
帖子: 11
注册时间: 2005-12-23 14:45

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#13

帖子 awu » 2010-08-19 16:35

看起来好强大啊,就是没看懂。。。。呵呵 :em11
aerofox 写了:写了个脚本,把它 source 之后应该就可以实现楼主要的功能了,但是要是我自己用,我不希望在 cd 命令中自动执行 update_cd_cache,因为这太费时了。脚本如下:

代码: 全选

#!/bin/bash
CD_CACHE_FILE=~/.cd_cache
function update_cd_cache()
{
    CD_SEARCH_ROOT=/home
    echo "Update cd cache file..." 1>&2
    find "$CD_SEARCH_ROOT" -type d -name X -printf "%h\n" -prune > $CD_CACHE_FILE 2> /dev/null
}

function cd()
{
    if ! command cd "$@" 2> /dev/null; then
	if [[ ! -f "$CD_CACHE_FILE" ]]; then
	    update_cd_cache
	elif [[ -r "$CD_CACHE_FILE" ]]; then
	    local cd_targ="${@:0-1}"
	    retval=
	    while read cache_dir; do
		if [[ "${cache_dir##*/}" == "$cd_targ" ]]; then
		    command cd "$cache_dir"
		    retval=$?
		    break
		fi
	    done < "$CD_CACHE_FILE"
	    if [[ -z "$retval" ]]; then
		update_cd_cache
		while read cache_dir; do
		    if [[ "${cache_dir##*/}" == "$cd_targ" ]]; then
			command cd "$cache_dir"
			retval=$?
			break
		    fi
		done < "$CD_CACHE_FILE"
	    fi
	    [[ -z "$retval" ]] && echo "cd: $cd_targ: No such directory" 1>&2
	    return ${retval:-2}
	fi
    fi
}
huanhai2006
帖子: 2
注册时间: 2010-09-14 19:41

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#14

帖子 huanhai2006 » 2010-09-14 20:03

你改一下CDPATH的值,可以直接改为home,然后用cd就可以了。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 菜鸟有一个关于改变目录的需求,怎么实现啊

#15

帖子 BigSnake.NET » 2010-09-14 20:49

符号链接
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
回复