bashrc中的代码不起作用

时间:2014-05-09 14:11:42

标签: bash grep find

下面的代码在bashrc中不起作用,但在终端中使用其他参数为null。

search () {
        find $1 -type f | egrep '(.$2|.$3|.$4|.$5|.$6|.$7|.$8|.$9|.$10)'
}

3 个答案:

答案 0 :(得分:1)

写下这个:

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*" \
  \)
}
  1. 正如@chepner指出的那样,引号会阻止参数扩展。使用双引号。
  2. egrep将创建基于行的匹配结果,该结果不如上述精确。它也慢了。
  3. 如果上述语句不完全符合您的要求,请记住GNU find除了-name的模式匹配外还有正则表达式谓词。没有必要管道grep。您可以通过构造find的参数来扩展上述函数以获取无限数量的参数,例如在this answer中。

答案 1 :(得分:0)

我不知道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代码不起作用。

是否可以使用正则表达式简化此代码?

谢谢你们!

答案 2 :(得分:0)

我更改了简单清除的代码;并使用任何数量的参数。

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;
}