如何将自定义函数的输出作为选项放入查找实用程序中?
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
只执行了一次,上面给出了所有参数:正是你想要的!
我想将扩展名列表作为参数发送。所以我写了一个小的辅助函数来解析一串扩展并以 "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
只执行了一次,上面给出了所有参数:正是你想要的!