下面的代码在bashrc中不工作,但在终端中使用其他参数为null。
search () {
find $1 -type f | egrep '(.$2|.$3|.$4|.$5|.$6|.$7|.$8|.$9|.$10)'
}发布于 2014-05-09 14:20:26
写这个:
search() {
find "$1" -type f \( -true \
-o -name "*$2*" \
-o -name "*$3*" \
-o -name "*$4*" \
-o -name "*$5*" \
-o -name "*$6*" \
-o -name "*$7*" \
-o -name "*$8*" \
-o -name "*$9*" \
-o -name "*$10*" \
\)
}egrep将创建一个基于行的匹配结果,这比上面的结果更不精确.也比较慢。如果上面的语句不是您所需要的,请记住,除了-name的模式匹配之外,GNU还有正则表达式谓词。没有必要向grep输送管道。您可以通过将参数构造为find (如在this answer中),将上述函数扩展为不受限制的参数。
发布于 2014-05-09 22:26:36
我不知道egrep得到的是文字文本$2而不是参数。我用这个代码解决了:
search-type () {
case "$#" in
1) echo "Missing arguments";;
2) find $1 -type f | egrep '(.'$2')';;
3) find $1 -type f | egrep '(.'$2'|.'$3')';;
4) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4')';;
5) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5')';;
6) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6')';;
7) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6'|.'$7')';;
8) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6'|.'$7'|.'$8')';;
9) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6'|.'$7'|.'$8'|.'$9')';;
10) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6'|.'$7'|.'$8'|.'$9'|.'$10')';;
11) echo "Many arguments";;
esac;
}@kojiro代码不起作用。
用regex可以简化这段代码吗?
谢谢你们!
发布于 2014-05-10 00:37:03
我修改了一些更简单的、简单的和clear的代码,并使用任意数量的参数。
search-type() {
# Flags
flag=0
fld=1
for x in "$@"
do
# The first parameter is the directory; ignored!
if [ $fld = 1 ]; then
fld=0
else
# Verify if have more than one file
if [ $flag = 0 ]; then
cmd='-name '$x
flag=1
else
cmd+=' -o -name '$x
fi
fi
done
find $1 -type f $cmd;
}https://stackoverflow.com/questions/23566801
复制相似问题