Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 匹配.h、.m、.mm文件,但不匹配.html_Bash - Fatal编程技术网

Bash 匹配.h、.m、.mm文件,但不匹配.html

Bash 匹配.h、.m、.mm文件,但不匹配.html,bash,Bash,我只想对.h、.m、.mm类型的源文件进行一些处理。我不想包含.html文件 以下内容忽略了.mm文件,因为我只匹配.h或.m而不尝试捕获更长的扩展名 find ./ -type f -name "*.[hm]" 这只捕获.mm文件,如?运算符始终匹配一个字符。我希望它是一个可选的零或一匹配,就像在正则表达式中一样 find ./ -type f -name "*.[hm]?" 但如果改用*,它将匹配0个或多个字符。这将返回所有内容,但也包含我不想要的.html文件 find ./ -typ

我只想对
.h、.m、.mm
类型的源文件进行一些处理。我不想包含
.html
文件

以下内容忽略了.mm文件,因为我只匹配
.h
.m
而不尝试捕获更长的扩展名

find ./ -type f -name "*.[hm]"
这只捕获.mm文件,如?运算符始终匹配一个字符。我希望它是一个可选的零或一匹配,就像在正则表达式中一样

find ./ -type f -name "*.[hm]?"
但如果改用*,它将匹配0个或多个字符。这将返回所有内容,但也包含我不想要的.html文件

find ./ -type f -name "*.[hm]*"

有什么办法吗?

您可以结合以下条件:

find -type f -and \( -name '*.h' -or -name '*.m' -or -name '*.mm' \)
或:


您可以组合以下条件:

find -type f -and \( -name '*.h' -or -name '*.m' -or -name '*.mm' \)
或:


您正在运行OS X。有一个
-E
开关,可以用来告诉
find
正则表达式是扩展表达式

将后跟-regex和-iregex原色的正则表达式解释为扩展(现代)正则表达式,而不是基本正则表达式(BRE)。re_format(7)手册页充分描述了这两种格式

您的命令现在应该可以工作了:

find -E . -type f -regex ".*\.([hm]|mm)"

您正在运行OS X。有一个
-E
开关,可以用来告诉
find
正则表达式是扩展表达式

将后跟-regex和-iregex原色的正则表达式解释为扩展(现代)正则表达式,而不是基本正则表达式(BRE)。re_format(7)手册页充分描述了这两种格式

您的命令现在应该可以工作了:

find -E . -type f -regex ".*\.([hm]|mm)"


如果您喜欢使用
regex
模式,
find
具有该功能。尝试
查找-regex“*\”(h\'m\'mm\)“
@alvits这正是我想要的,但我似乎无法让你的例子起作用。我一进入“状态”,它就坏了。我还尝试了以下使用?作为一种选择,零场或一场没有运气的比赛<代码>查找-键入f-regex“*\.[hm]m?”正确的regex应该是
find-正则表达式“*\”([hm]\\\\\\\\\\)”
。仍然没有运气。如果我删除搜索的第二部分,它就会工作(查找.h和.m文件)
find-regex“*\。\([hm]\)”
但是如果我执行上面的命令,它将不会返回任何结果。你能告诉我你正在运行什么操作系统以及find的版本吗?我正在运行redhat 6.6和findutils 4.4.2。如果您更喜欢使用
regex
模式,
find
具有该功能。尝试
查找-regex“*\”(h\'m\'mm\)“
@alvits这正是我想要的,但我似乎无法让你的例子起作用。我一进入“状态”,它就坏了。我还尝试了以下使用?作为一种选择,零场或一场没有运气的比赛<代码>查找-键入f-regex“*\.[hm]m?”正确的regex应该是
find-正则表达式“*\”([hm]\\\\\\\\\\)”
。仍然没有运气。如果我删除搜索的第二部分,它就会工作(查找.h和.m文件)
find-regex“*\。\([hm]\)”
但是如果我执行上面的命令,它将不会返回任何结果。你能告诉我你正在运行什么操作系统以及find的版本吗?我正在运行redhat 6.6和findutils 4.4.2。虽然OP没有说明可能存在哪些其他文件,或者甚至可能没有意识到除上述3个文件之外可能存在其他文件,但您的第二个解决方案将找到其他文件,这些文件可能以
.mpg
、mpa
.mpeg
和更多文件结尾。效果非常好。我最后得到了
find./-typef-和\(-name'*.[hm]'-或-name'*.mm'\)
的同意。这里我需要第一个选项,因为我需要明确地匹配.h、.m.mm,而不是其他。@alvits,你完全正确,只是想展示一些其他的可能性。虽然这些选项可以找到工作,但我发现使用-E标志和-regex要容易得多,正如问题下面的注释所述。我宁愿使用正则表达式而不是上面的语法。虽然OP没有说明可能存在哪些其他文件,或者甚至可能没有意识到除了上面提到的3个文件之外可能存在其他文件,但您的第二个解决方案将找到可能以
.mpg
、mpa
.mpeg
以及更多文件结尾的其他文件。效果非常好。我最后得到了
find./-typef-和\(-name'*.[hm]'-或-name'*.mm'\)
的同意。这里我需要第一个选项,因为我需要明确地匹配.h、.m.mm,而不是其他。@alvits,你完全正确,只是想展示一些其他的可能性。虽然这些选项可以找到工作,但我发现使用-E标志和-regex要容易得多,正如问题下面的注释所述。我宁愿只使用正则表达式而不是上面的语法。我真的很喜欢这种使用完整正则表达式的能力,而不是使用
find
上的其他选项。感谢您指出这一点-我以后将专门使用它。我非常喜欢使用完整正则表达式而不是
find
上的其他选项。感谢您指出这一点-我将在未来专门使用它。