Bash:通过变量将文件模式作为参数传递给命令

Mik*_*e M 1 bash find

如果已经回答,我很抱歉,但如果是,我找不到合适的搜索条件.

我正在尝试为find命令动态定义搜索项(基于用户定义的设置):

# reading user settings results in array of filename patterns to delete:
patterns=("*.url" "*.html")
for i in ${patterns[@]}; do 
  find . -iname $i -delete
done
Run Code Online (Sandbox Code Playgroud)

如果我echo是命令,结果字符串看起来是正确的,例如

find . -iname "*.url" -delete
find . -iname "*.html" -delete
Run Code Online (Sandbox Code Playgroud)

我知道我错过了一些显而易见的东西,但我尝试过的东西都没有.

如果有帮助,我正在使用Bash 4.4.5.

- - - - - - - - 编辑 - - - - - - - - -

感谢Charles Duffy和l'L'l提供正确的解决方案.我很难将数据字符串中的引号与引用的变量包围在一起,并且无法同时引用这两个变量.

获得的经验:总是引用shell变量.

Cha*_*ffy 5

l'L'l的答案很好,但是让我们find通过在一个命令行中传递所有模式只调用一次来提高效率:

patterns=("*.url" "*.html")
find_pat=( )

for i in "${patterns[@]}"; do
  find_pat+=( -o -name "$i" )
done

find . -iname '(' "${find_pat[@]:1}" ')' -delete
Run Code Online (Sandbox Code Playgroud)

运行时,这将调用:

find . -iname '(' -name '*.url' -o -name '*.html' ')' -delete
Run Code Online (Sandbox Code Playgroud)

......从而删除匹配所有文件或者 *.url或者*.html在一个单一的通行证.


注意:

  • 我们总是引用我们的全局:它们在赋值时被引用(所以我们将球体本身分配给patterns数组),数组扩展(因此我们迭代自己而不是它们的结果),并且在扩展到findcommand(所以我们传递find文字模式语法,而不是扩展该语法的结果).
  • 我们前面加上-ofind_pat数组,但是然后从第二元件膨胀(阵列为0索引),从而跳过初始-o.这里使用的语法是参数扩展.