在变量中使用linux“查找”命令的多名称功能?

在变量中使用linux“查找”命令的多名称功能?

我新学会了如何使用find以下命令搜索多个文件名:

find . \( -iname "*.srt" -o -iname "*.mp4" \)

但在某些情况下,我不得不使用如此多的过滤器,这样简单的命令行就变得很长:

find . \( -iname "*.srt" -o ......... \)

我可以创建一个变量并将所有过滤器添加到其中,然后在 find 命令中再次使用它吗?谢谢!

答案1

通过 GNU 实现find,还有另一种搜索多个文件名的方法:

rgx='.*\.srt\|.*\.mp4'
find . -iregex "$rgx"

\|逻辑正则表达式 OR(在 GNU 的默认正则表达式类型中find是 emacs 类型)。裸露.意味着任何字符。一个点是\..

您可以定义 a$rgx_compr和 a $rgx_media,然后将其组合:

find . -iregex "$rgx_compr" -o -iregex "$rgx_media"

我在这里省略了括号。

答案2

由于您使用的是支持数组变量(即 )的 shell,因此bash您可以创建一个数组变量并直接使用它。

常数表达式

find . \( -iname "*.srt" -o -iname "*.mp4" \) ...

变量表达式

opts=(-iname "*.srt" -o -iname "*.mp4")
find \( "${opts[@]}" \) ...

或者

opts=( '(' -iname "*.srt" -o -iname "*.mp4" ')' )
find "${opts[@]}" ...

请注意,数组变量扩展本身必须用双引号 ( "${opts[@]}") 括起来,即使它包含一项或多项。如果数组不包含任何项目,它将扩展到没有什么(不是空字符串,"")。

答案3

对的,这是可能的。使用我下面展示的方法,请注意引号、通配符等的使用。尽管如此,这里是一种解决方案BASH

opt="-iname '*.srt' -o -iname '*.mp4'"
find . \( $(eval echo ${opt}) \)

虽然不可能简单地${opt}在命令中调用变量,但我们可以通过使用行内命令find来解决它。eval$(eval echo ${opt})

相关内容