ack:排除一个目录但保留所有其他同名目录

56

我的文件夹结构看起来像这样:

/app
/app/data
...
/app/secondary
/app/secondary/data

我想要递归搜索/app,包括/app/data。但是我不想搜索/app/secondary/data。这是我目前的代码:

ack --ignore-dir=data searchtext
ack --ignore-dir=secondary/data searchtext

第一个命令忽略了两个目录,第二个命令则没有忽略它们。从应用程序文件夹中,我的ack命令应该是什么样子的?

2个回答

60

早期版本的ack只能接受文件夹名称,而不能接受文件夹路径。从版本1.93_02开始,它们已经添加了这个功能:

1.93_02     Wed Oct  6 21:39:58 CDT 2010
   [ENHANCEMENTS]
   The --ignore-dir option now can ignore entire paths relative
   to your current directory.  Thanks to Nick Hooey.  For example:

       ack --ignore-dir=t/subsystem/test-data

(来源于betterthangrep.com/Changes)

您可以使用--version命令来检查您当前所使用的版本:

ack --version

请注意,在使用grep命令时,这个选项必须放在要搜索的字符串之前(例如,ack --ignore-dir=foo/ 'bar',而不是 ack 'bar' --ignore-dir=foo/)。 - toku-sa-n

23

本答案适用于2版本之前的Ack,查看此答案以获取适用于Ack >= 2的版本

第一个忽略了两个目录,因为它们都有“data”作为子目录,而ack默认情况下搜索子目录。因此它将忽略任何具有该名称的子目录。不幸的是,你的第二种方式也不起作用。这个对我有效:

ack -a searchtext -G '^(?!.*secondary/data.*).*$'

不要使用-a选项搜索所有文件,可以查看ack-grep --help=types以仅搜索特定文件类型,例如--type=text。


谢谢回复。我得到了这个:$ ack-grep --text -G '^(?!.*secondary/data.*).*$' ack-grep:未找到正则表达式。 - mattalxndr
这是因为您忘记给它提供要搜索的模式,即“searchtext”。 - rkulla
有关如何将此-G选项放入“~/.ackrc”文件的信息,请参见:https://dev59.com/cVXTa4cB1Zd3GeqP2o7L。 - Greg Hewgill
4
在ack 2中,选项“-G”无效。 - Adam Parkin
我们如何让ack永久执行此操作,例如在.ackrc文件中? - nyxee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接