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变量,也没有用。。。
不知道有没有什么好办法?或都我的办法有问题?

-
awu
- 帖子: 11
- 注册时间: 2005-12-23 14:45
#3
帖子
由 awu » 2010-08-17 1:39
这个。。。。bash是俺的工作环境中强制使用的,换不了。。。
zsh能实现上面的功能?
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#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
#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
#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
- 来自: 长沙
#7
帖子
由 eexpress » 2010-08-17 10:42
千年不动的目录,居然用find。。。。不是找麻烦嘛。
用locate
● 鸣学
-
awu
- 帖子: 11
- 注册时间: 2005-12-23 14:45
#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当前目录的办法。
谢谢楼上各们啊啊啊

-
trigger
- 帖子: 1604
- 注册时间: 2006-10-25 18:08
#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
#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
#11
帖子
由 冲浪板 » 2010-08-17 23:20
lz开黑窗口,然后开鹦鹉螺(是这个吧?),然后拉文件夹到黑窗口....
在win里就是那么用的说
-
davidlone
- 帖子: 626
- 注册时间: 2007-03-06 18:14
- 来自: 常德--重庆
#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
#13
帖子
由 awu » 2010-08-19 16:35
看起来好强大啊,就是没看懂。。。。呵呵
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
}
-
BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
-
联系:
#15
帖子
由 BigSnake.NET » 2010-09-14 20:49
符号链接
^_^ ~~~
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。