如何使用带变量的 find 命令

如何使用带变量的 find 命令

find我正在通过部分文件名搜索文件:

find /script -name '*file_topicv*'
/script/VER_file_topicv_32.2.212.1

它有效,但当部分文件名是变量时无效:

var=file_topicv

find报告找不到文件(尽管文件存在):

find /script -name '*$var*'

这里有什么问题吗?


我也尝试过这些:

find /script -name "*$var*"
find /script -name "*\$var*"
find /script -name "*\\$var*"

但其中没有一件作品。


更新:

我认为这就是问题所在:

var=` find /tmp -name '*.xml' -exec sed -n 's/<Name>\([^<]*\)<\/Name>/\1/p' {} +  |  xargs `

echo $var
generateFMN

ls  /script/VERSIONS | grep "$var"

NO OUTPUT

var=generateFMN
 ls  /script/VERSIONS | grep "$var"
VER_generateFMN_32.2.212.1

那么为什么$varfind命令会导致这个问题呢? (我删除了空格xargs。)

答案1

第一个双引号应该有效:

$ touch asdfghjkl
$ var=fgh
$ find -name "*$var*"
./asdfghjkl

在单引号 ( '*$var*') 内,变量不会扩展,并且当美元符号在双引号 ( "*\$var*") 中转义时,变量也不会扩展。如果对美元符号 ( "*\\$var*") 进行两次转义,则该变量会展开,但find也会得到一个文字反斜杠。 (但find似乎又将反斜杠作为转义符,所以它并没有改变含义。)

因此,虽然令人困惑,但这也是有效的:

$ set -x
$ find -name "*\\$var*"
+ find -name '*\fgh*'
./asdfghjkl

您可以尝试在启用的情况下运行所有​​其他参数,set -x以查看实际获得的参数find

{}像往常一样,如果变量名称后跟字母、数字或下划线,则将变量名称括在大括号中,例如"*${prefix}somename*"

相关内容