我新学会了如何使用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})