如何使用带有变量的 find 命令

yae*_*ael 5 linux find shell-script variable

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

find /script -name '*file_topicv*'
/script/VER_file_topicv_32.2.212.1
Run Code Online (Sandbox Code Playgroud)

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

var=file_topicv
Run Code Online (Sandbox Code Playgroud)

find 未找到报告的文件,(尽管文件存在):

find /script -name '*$var*'
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?


我也试过这些:

find /script -name "*$var*"
find /script -name "*\$var*"
find /script -name "*\\$var*"
Run Code Online (Sandbox Code Playgroud)

但不是这些作品之一。


更新:

我认为这是问题所在:

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
Run Code Online (Sandbox Code Playgroud)

那么为什么$var来自find命令会导致问题呢?(我删除了空格xargs。)

ilk*_*chu 9

第一个双引号应该有效:

$ touch asdfghjkl
$ var=fgh
$ find -name "*$var*"
./asdfghjkl
Run Code Online (Sandbox Code Playgroud)

在单引号 ( '*$var*') 中,变量不会扩展,当美元符号在双引号 ( "*\$var*") 中转义时,变量也不会扩展。如果您对美元符号 ( "*\\$var*") 进行双重转义,则该变量会被扩展,但find也会得到一个字面反斜杠。(但find似乎再次将反斜杠作为转义符,因此它不会改变含义。)

因此,尽管令人困惑,但这也有效:

$ set -x
$ find -name "*\\$var*"
+ find -name '*\fgh*'
./asdfghjkl
Run Code Online (Sandbox Code Playgroud)

您可以尝试使用set -xenabled运行所有其他参数以查看find实际获得的参数。

像往常一样,{}如果变量名后面跟有字母、数字或下划线,例如"*${prefix}somename*".