包含多种文件类型的选项?
当我想要grep某些目录中的所有html文件时,我会执行以下操作
grep --include="*.html" pattern -R /some/path
这工作得很好。 问题是如何在某些目录中grep所有的html,htm,php文件?
从这个使用grep --exclude / - 包括语法不通过某些文件grep,似乎我可以做到以下几点
grep --include="*.{html,php,htm}" pattern -R /some/path
但可悲的是,它不适合我。
仅供参考,我的grep版本是2.5.1。
您可以使用多个--include
标志。 这适用于我:
grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/
但是,您可以按照Deruijter
建议进行操作。 这适用于我:
grep -r --include=*.{html,php,htm} "pattern" /some/path/
不要忘了你可以使用find
和xargs
这件事情:
find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"
HTH
尝试删除双引号
grep --include=*.{html,php,htm} pattern -R /some/path
使用{html,php,htm}
只能用作括号扩展 ,它是bash
, ksh
和zsh
的非标准(不符合POSIX标准)特性。
换句话说:不要试图将它用在以/bin/sh
目标的脚本中 - 在这种情况下使用显式的多个--include
参数。
grep
本身不理解{...}
表示法。
要识别大括号扩展,它必须是命令行上未加引号(部分)的标记 。
括号扩展扩展为多个参数 ,所以在这种情况下, grep
最终会看到多个--include=...
选项,就像您单独传递它们一样。
大括号扩展的结果受制于globbing(文件名扩展) ,其具有缺陷 :
每个结果参数可能会进一步扩展为匹配文件名,如果它恰好包含未引用的通配符元字符(如*
。
虽然使用诸如--include=*.html
标记的可能性不大(例如,如果要匹配一些文件,必须将文件的字面名称命名为--include=foo.html
),但值得记住的是一般。
如果nullglob
shell选项恰好处于打开状态( shopt -s nullglob
)并且globbing不匹配,则参数将被丢弃。
因此,要获得完全可靠的解决方案 ,请使用以下内容:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
由于被单引号而被视为文字; 这可以防止无意中将*
解释为通配符。
{html,php,htm}
是必要的 - 不加引号的括号扩展[1],扩展为3个参数,由于{...}
直接跟在'...'
标记之后,包含该标记。
因此,在shell删除引号后, 以下3个文字参数最终传递给grep
:
--include=*.html
--include=*.php
--include=*.htm
[1]更准确地说,只有大括号扩展中与语法相关的部分必须不加引号,列表元素仍然可以单独引用,并且必须是包含通配符的元字符,这些元字符可能会导致大括号扩展后出现不需要的通配符; 虽然在这种情况下不是必需的,但上面可以写成
'--include=*.'{'html','php','htm'}