有没有办法防止find
命令上的通配符扩展,以便以下内容可以工作?
find . -iname "foo [bar]"
正如所指出的这里,我之前尝试过跑步set -f
,set -o noglob
但没有成功。setopt noglob
find
这是一个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。-name
and 的参数-iname
是图案本身。将[bar]
意味着b
,a
或者。尝试转义方括号,即:r
find
find . -iname 'foo \[bar\]'
(编辑:这样,您就不会在 shell 级别转义它们,而是将反斜杠传递给find
。)