我只想要grep在源代码中的头文件。而且它似乎是众所周知的和已经解决的问题,但--include=不适合我:
$ grep -rnI --include=\*.h 'static volatile'
net/ipv4/ipconfig.c:174:static volatile int ic_got_reply __initdata; /* Proto(s) that replied */
drivers/mtd/maps/sbc_gxx.c:83:static volatile int page_in_window = -1; // Current page in window.
drivers/parport/parport_mfc3.c:79:static volatile int dummy; /* for trigger readds */
^C我希望只有具有.h扩展名的头文件。
顺便说一句,--exclude=运行得很好:
$ grep -rnI --exclude=\*.c 'static volatile'
arch/mips/include/asm/mach-pmcs-msp71xx/msp_gpio_macros.h:63:static volatile u32 * const MSP_GPIO_DATA_REGISTER[] = {
arch/mips/include/asm/mach-pmcs-msp71xx/msp_gpio_macros.h:83:static volatile u32 * const MSP_GPIO_MODE_REGISTER[] = {
arch/arm/mach-w90x900/include/mach/uncompress.h:28:static volatile u32 * const uart_base = (u32 *)UART0_PA;
arch/arm/mach-gemini/include/mach/uncompress.h:19:static volatile unsigned long * const UART = (unsigned long *)GEMINI_UART_BASE;
^CUPD:
$ grep --version
grep (GNU grep) 2.27
...
$ type grep
grep is aliased to `grep --color --exclude=tags --exclude-dir="build*"'但是,当别名以$ \grep -rnI --include=\*.h 'static volatile'的方式被取消时,它工作得很好。
那么为什么--exclude=要取消--include=呢?
发布于 2020-06-05 10:23:30
有关别名重写,请参见:别名
我找不到关于多个包含/排除规则如何影响所选择的文件的最终列表的文档。但我认为,在发生冲突时,可以放心地假定,在命令行中定义的最新规则获胜。
--exclude=tags将忽略任何名为tags的文件或目录。--include='*.h'将允许匹配任何以.h结尾的文件。在这种情况下,这两条规则之间没有冲突。第一个允许grep选择任何未命名为tags的文件。第二个命令告诉grep允许任何以.h结尾的文件
如果发生像--exclude='*foo.txt' --include='*.txt'这样的冲突,包含规则将覆盖排除规则,并且将考虑以foo.txt结尾的文件进行匹配。
发布于 2020-06-06 00:37:55
如果您只使用find来查找文件,在文件中查找文件,使用grep到g/re/p (在工具名称中有一些微妙的线索说明它们的用途!)然后,您将不必处理guys在给grep选项find文件时创建的混乱、混乱和复杂的问题。
find . -type f -name '*.h' -exec grep -nIH 'static volatile' {} +可能就是你所需要的。
https://stackoverflow.com/questions/62212221
复制相似问题