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
那么为什么$var
从find
命令会导致这个问题呢? (我删除了空格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*"
。