防止查找时通配符扩展

防止查找时通配符扩展

有没有办法防止find命令上的通配符扩展,以便以下内容可以工作?

find . -iname "foo [bar]"

正如所指出的这里,我之前尝试过跑步set -fset -o noglob但没有成功。setopt noglobfind

这是一个bash脚本,我正在使用 Ubuntu 10.04。

我知道我可以逃避通配符,但我担心我可能会漏掉一个。

答案1

正如 @njsg 已经说过的,问题是由 引起的find,而不是 shell 引起的:您使用的双引号已经保护您的表达式免受 shell 的影响;它被传递给find未修改的。

问题在于find将论证视为-name一种-iname模式。抑制这种情况的唯一方法是使用find不将其参数视为模式的选项。但find根据我的手册页,没有这样的东西,所以你想要的东西无法完成。您能做的最好的事情就是增强您的脚本,使其在将括号传递到find.下面看起来很有趣的sed替换可以为你做到这一点:

echo "foo [bar]" | sed 's/[][]/\\&/g'

将打印:foo \[bar\]

答案2

问题不在于 shell,而在于 find。-nameand 的参数-iname图案本身。将[bar]意味着ba或者。尝试转义方括号,即:rfind

find . -iname 'foo \[bar\]'

(编辑:这样,您就不会在 shell 级别转义它们,而是将反斜杠传递给find。)

相关内容