![具有多个模式的 find 命令不返回任何输出](https://linux22.com/image/113730/%E5%85%B7%E6%9C%89%E5%A4%9A%E4%B8%AA%E6%A8%A1%E5%BC%8F%E7%9A%84%20find%20%E5%91%BD%E4%BB%A4%E4%B8%8D%E8%BF%94%E5%9B%9E%E4%BB%BB%E4%BD%95%E8%BE%93%E5%87%BA.png)
#!/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"
请注意,您要传递的是*.ab
and参数,而不是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" \)