通配符扩展 - 在一组可能性中搜索一个

时间:2009-09-28 02:16:29

标签: bash

我本可以发誓你可以做以下事情:

ls *.{java, cpp} 

但这似乎不起作用。我知道这个答案可能在网站的某处,但我无法通过搜索找到它。

例如,如果我希望能够使用find命令使用globbing,我会想做类似的事情

find . -name "*.{java,cpp}" | xargs grep -n 'TODO'

这是否可以不使用-o二元运算符?

4 个答案:

答案 0 :(得分:3)

您可能会看到如下错误消息:

  

ls:无法访问*。{java:没有这样的文件或目录
  ls:无法访问,cpp}:没有这样的文件或目录

如果是这种情况,那是因为逗号之后的空格。把它拿出来:

ls *.{java,cpp}

为了将来参考,发布错误消息比说“它不起作用”更有帮助(请不要亲自接受。这对每个人来说都是有意义的。我甚至会这样做有时太经常了。)

答案 1 :(得分:1)

ls *.{java,cpp}在bash中对我很好......:

$ ls *.{java,cpp}
a.cpp       ope.cpp     sc.cpp      weso.cpp
helo.java   qtt.cpp     srcs.cpp

确定它不适合你......?

find不同,但

find -E . -regex '.*\.(java|cpp)'

应该做你想做的事情(在某些版本中你可能不需要-E,或者你可能需要-regextype选项,在你的特定系统上找到“man find”以找出答案。 / p>

答案 2 :(得分:0)

但是这个 在Bash中工作:

$ ls
a.h  a.s  main.cpp  main.s
$ ls *.{cpp,h}
a.h  main.cpp

确定你在Bash吗?如果您是,可能是别名导致此问题:请尝试/bin/ls *.{java,cpp}以确保您不会调用别名ls

或者,只需取出{}内列表中的空格 - 空格导致错误,因为Bash会将*.{java,视为ls的一个参数1}},它会将cpp}视为第二个参数。

答案 3 :(得分:0)

对于您的特定示例,这也可能会执行您想要的操作

grep -rn TODO . --include '*.java' --include '*.cpp'