BASH:如何使用find正确使用模式

时间:2013-11-21 23:26:11

标签: bash terminal find

我拼命想为find命令编写模式,但它永远不会有效。我想搜索所有*.txt*.h个文件:

find . -name "*(*.h|*.txt)"

find . -name "(*.h|*.txt)"

find . -name *(*.h|*.txt)

find . -name "*\(*.h|*.txt\)"

find . -name '*("*.h"|"*.txt")'

2 个答案:

答案 0 :(得分:3)

使用此表达式:

find . -type f \( -name "*.h" -or -name "*.txt" \)
  • -type f只找到文件。
  • -name \( logical condition \)只是与您指定的文件扩展名匹配。

答案 1 :(得分:3)

你走了:

find . -name '*.h' -o -name '*.txt'

如果您的条件不仅仅是名称,例如修改时间少于5天,那么您最有可能想要对多个名称条件进行分组,如下所示:

find . -mtime -5 \( -name '*.h' -o -name '*.txt' \)

这样你的条件就变成了“TIME AND(NAME1或NAME2)”,没有分组,它将是“TIME AND NAME1 OR NAME2”,这是不一样的,因为后者将被评估为“(TIME AND NAME1 )或NAME2“。

嗯,这取决于你想做什么,只要记住当你使用这样的OR条件时,你可能需要使用\( ... \)进行分组,如上例所示。

<强>更新

如果您的find版本支持-regex标记,则另一个解决方案:

find . -regex '.*\.\(txt\|h\)'

我认为这更像你要找的东西; - )

虽然-name pattern中的模式可以与*?[]等常规shell模式匹配,但它们似乎无法与extended patterns匹配,即使extglob已启用。