具有多个模式的 find 命令不返回任何输出

具有多个模式的 find 命令不返回任何输出
#!/bin/bash
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path

find $path -type f $open -name $pat $close

上面的代码没有显示任何 find 的输出。帮忙

答案1

pat="'*.ab' -o -name '*.bc'"
find $path -type f $open -name $pat $close

这并没有达到您想要的效果:变量中的引号pat不被视为引号,而是被视为文字字符。展开后$pat,进行分词,得到单词'*.ab', -o,-name'*.bc',单引号仍然完好无损。因此,除非您的文件名中包含单引号,否则这将不匹配。

path=path

这将变量设置path为文字 string path,但我认为这只是一个占位符。

open="\("
close="\)"

这些在变量中放入了文字反斜杠,并且find当它获得 的参数时可能会抱怨\(。引用括号一次就足够了,所以open="("或者open=\(

如果您需要为 构建表达式列表find,请使用带有数组的 shell(Bash 或几乎任何除了 plain 的东西sh):

args=()  
args+=( -name "*.ab" )
args+=( -or -name "*.bc" ) 

find ... \( "${args[@]}" \)

根据需要将数组构建包装在循环中。

答案2

您使用了错误类型的变量,并且忘记引用它们。

在这里,您需要一个数组来存储多个参数:

#! /bin/bash -
pat=('*.ab' -o -name '*.bc')
open='('
close=')'
path=path

find "$path" -type f "$open" -name "${pat[@]}" "$close"

请注意,您要传递的是*.aband参数,而不是or 。这些引号和反斜杠是 shell 语法的一部分。(find'*.ab'\(

仅当您想构建一个 shell 命令行时,例如传递eval给 shell 来评估它,您才会这样做:

#! /bin/bash -
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path

eval 'find "$path" -type f '"$open -name $pat $close"

然后让 shell 进行评估:

find "$path" -type f \( -name '*.ab' -o -name '*.bc \)

如上所述,会导致find使用这些参数进行调用:

  • find
  • path(内容$path
  • -type
  • f
  • (
  • *.ab
  • -o
  • -name
  • *.bc
  • )

答案3

使用简单的方法(而不是使用变量):

find $path -type f -name "*.ab" -o \( -name "*.bc" \)

相关内容