如何将自定义函数的输出作为选项放入查找实用程序中?

How to put custom function's output into find utility as an option?

我想将扩展名列表作为参数发送。所以我写了一个小的辅助函数来解析一串扩展并以 "find" 实用程序期望的方式对其进行格式化:

exts="txt log";
track=0;
function ext_parse()
{
for i in $exts; do
  if [[ $track -eq 0 ]]
  then
    varstr="-iname \"*.$i\"";
    track=1;
  else
    varstr="$varstr -o -iname \"*.$i\" ";
  fi
done
echo "$varstr";
}

所以它 returns:

-iname "*.txt" -o -iname "*.log" 

如果我将其直接放入 "find" 中,效果很好:

find . -type f \( -iname "*.txt" -o -iname "*.log" \) -print

但是任何用我尝试过的上面的函数替换这个字符串的尝试都失败了。

是否有任何方法可以实现该行为,或者无法通过设计实现?

我认为它更干净、更安全且更易于使用数组:

ext_parse() {
    local i
    varstr=()
    for i; do
        ((${#varstr[@]}!=0)) && varstr+=( -o )
        varstr+=( -iname "*.$i" )
    done
}

要使用此函数,您首先需要使用适当的参数调用它,例如 ext_parse txt log;这将设置 array varstr;然后您可以将其用作:

find -type f \( "${varstr[@]}" \)

因此您的工作流程如下所示:

$ ext_parse txt log
$ find -type f \( "${varstr[@]}" \)

RE:您的评论:为了澄清您对 find 是 运行 数组中每个元素一次的担忧(这是错误的!),请执行以下测试:将以下脚本另存为 banana:

#!/bin/bash

for ((i=1;i<=$#;++i)); do
    printf 'Argument %d: %s\n' "$i" "${!i}"
done

然后chmod +x banana,试试看:

$ ext_parse txt log
$ ./banana -type f \( "${varstr[@]}" \)
Argument 1: -type
Argument 2: f
Argument 3: (
Argument 4: -iname
Argument 5: *.txt
Argument 6: -o
Argument 7: -iname
Argument 8: *.log
Argument 9: )

所以你可以看到 banana 只执行了一次,上面给出了所有参数:正是你想要的!