如何使用GNU find精确查找含特殊字符变量的文件名
无需正则精确查找带特殊字符的文件
问题原因
你用find -name "$name"失效,是因为-name参数默认遵循shell通配符规则,而非精确字符串匹配。比如变量里的[Proper]会被解析为匹配P/r/o/p/e/r中的任意单个字符,自然匹配不到目标文件。
解决方法
1. 精确匹配完整文件名
如果要找文件名完全等于$name的文件,用test命令做纯字符串比较,避开通配符解析:
name="Poweramp v3 Skin Liv Dark - v1.7 [Proper]" # 匹配当前目录下的目标文件 find . -type f -exec test {} = "./$name" \; -print # 匹配任意子目录下的目标文件(提取文件名后比较) find . -type f -exec test "$(basename {})" = "$name" \; -print
2. 部分匹配(文件名包含指定内容)
如果要找文件名包含$name片段的文件,用grep -F(固定字符串匹配,不解析正则)配合空字符分隔处理特殊字符:
name="Poweramp v3 Skin Liv Dark - v1.7 [Proper]" find . -type f -print0 | grep -Fz "$name"
-print0让find用空字符分隔文件名,-z让grep对应使用空字符作为分隔符,能完美处理带空格、换行、特殊符号的文件名。
3. 仅用GNU find实现固定字符串匹配
如果你坚持只用find命令,GNU find支持用\Q\E引用固定字符串,避免正则解析:
name="Poweramp v3 Skin Liv Dark - v1.7 [Proper]" # 精确匹配完整文件名 find . -type f -regex "\Q$name\E" # 部分匹配(文件名包含目标片段) find . -type f -regex ".*\Q$name\E.*"
\Q标记固定字符串的开始,\E标记结束,中间内容不会被当作正则特殊字符解析。
补充:当前目录快速查找
如果仅在当前目录查找,直接用ls配合grep -F即可:
ls -1 | grep -F "$name"
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

