如何让ack忽略目录中的文件?

时间:2014-07-18 00:11:35

标签: bash pattern-matching ack

我在目录a/b/c.js

中有一个文件

我无法忽略c.js --ignore-file=match:c.js,因为我想匹配名为c.js的其他文件

我无法使用a/b忽略dir --ignore-dir=a/b,因为 a/b

中还有其他我关心的文件

我试过了:

--ignore-file=a/b/c.js       "Invalid filter specification"

我试过了:

--ignore-file=match:/a\/b\/c.js/

不能正常工作,而且我猜测它是因为ack没有将文件路径作为匹配的一部分读取,只是名称。

我试过了:

--ignore-dir=match:/a\/b\/c.js/     " Non-is filters are not yet supported for --ignore-dir (what?)"

我在Ack manual汤中找不到任何有用的东西。如何忽略目录中的文件?

2 个答案:

答案 0 :(得分:2)

答案是it is impossible

答案 1 :(得分:1)

您可以使用find ... ! -path ...轻松搜索与给定路径匹配的文件

此外,find ... -exec ... \{} \+允许使用附加的文件列表启动命令。

我手边没有ack,但使用grep作为占位符,这将导致:

sh$ echo toto > a/b/c.js
sh$ echo toto > a/c.js
sh$ echo toto > a/b/x.js
sh$ find . \! -path './a/b/c.js' -type f -exec grep toto \{} \+
#        ^           ^                         ^^^^
#      pattern should match              replace by a call to `ack`
#       your search path
./a/c.js:toto
./a/b/x.js:toto

编辑:路径模式开头的./存在潜在缺陷。 您可能更愿意使用find ... ! -samefile ...拒绝与给定文件具有相同 inode 的已找到文件:

sh$ find . \! -samefile a/b/c.js -type f -exec grep toto \{} \+
#                      ^^^^^^^^
#                  no dot here; this is a *file*
#                  can't use glob patterns (*, ?, ...)
./a/c.js:toto
./a/b/x.js:toto

来自man find

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.

   -path pattern
          File  name matches shell pattern pattern.  The metacharacters do
          not treat `/' or `.' specially; so, for example,
                    find . -path "./sr*sc"
          [...]

   -samefile name
          File refers to the same inode as name.   When -L is  in  effect,
          this can include symbolic links.