【问题标题】:How do you exclude a specific file from ack (ack-grep)?如何从 ack (ack-grep) 中排除特定文件?
【发布时间】:2012-07-23 01:52:19
【问题描述】:

使用普通的grep 命令有一个--exclude 选项(此处详细介绍:Use grep --exclude/--include syntax to not grep through certain files),可让您在 grepping 时忽略特定文件。

Ack 的 --type 选项可以处理 95% 的您想要排除文件的情况,但它不能(据我所知)处理排除特定文件的情况。我有一个已编译的 JS 文件,其中包含所有其他 JS 文件的内容(在一行上),所以每次我 grep for anything 时,我都会返回那个已编译的巨人的全部内容文件。

我不想不得不放弃 ack 并返回 grep 解决这个问题,但它真的很烦人。请有人告诉我有一种方法可以从 ack 搜索中排除特定文件。

【问题讨论】:

    标签: ack


    【解决方案1】:

    要使用 ack 2.0 忽略单个文件,请为 --ignore-file 标志提供过滤规范:

    --ignore-file=is:cljout.js

    【讨论】:

    • is: 在这里做什么?
    • 这适用于我的文件名,但如果我想给出一个特定的文件(即路径和文件名)则不行。
    • 您可以使用match 和正则表达式来匹配文件名,使用ext 来匹配扩展名。排除js文件--ignore-file=ext:js。排除名称为 foo 和 bar --ignore-file='match:/foo|bar/' 的文件。在使用 | 的正则表达式的情况下,用引号转义参数,以便 shell 不会将其作为管道执行。
    • 这整个is: 的事情并不明显和烦人
    【解决方案2】:

    如果你运行ack --create-ackrc,它会输出一整套常用文件的预设,比如缩小的 javascript、css 和 node_modules 和 .git 等目录。很有用!

    这是缩小的 js 选项:

    # minified Javascript
    --ignore-file=match:/[.-]min[.]js$/
    --ignore-file=match:/[.]js[.]min$
    

    以下是如何忽略名为 foo 的目录:

    --ignore-directory=is:foo
    

    如果你想把它保存到.ackrc运行

    ack --create-ackrc >> ~/.ackrc
    

    然后从该文件中删除您不需要的内容。

    此外,您可以在项目的根文件夹中创建另一个 .ackrc 文件,以存储项目特定的内容。我把它放在 .gitignore 中,这样它就不会弄乱 repo。

    【讨论】:

    • 我相信--ignore-directory 不接受像is: 这样的过滤器,就像--ignore-file 一样。 --ignore-directory 只接受一个目录名。
    【解决方案3】:

    不,ack 1.x 不会让您排除单个文件。在ack 2.0,你可以。 ack 2.0 目前处于其第一个 alpha 阶段现在是当前推荐的 ack 版本。

    就您的缩小 Javascript 文件的具体情况而言,您使用的是什么版本的 ack? ack 1.96 应该忽略基于扩展的缩小 JavaScript。如果扩展检查不起作用,您可能会自行破解 ack,因为它是一个单独的 Perl 程序。你可以破解is_searchable函数。

    在 ack 2.0 中,我们正在考虑忽略任何超过 500 个字符的行,因为它显然不是源代码。

    您可能还想加入我们的ack-users 邮件列表。我们反应灵敏。

    【讨论】:

    • 事实上,我的下一站将是确认邮件列表,但我想我会先检查这里以确保我没有遗漏一些明显的东西 :-) 谢谢安迪。跨度>
    • P.S.我正在为我编译的 JS 文件选择文件名,所以目前它只是 build.js。我会尝试将其重命名为built.min.js,看看是否有帮助。
    【解决方案4】:

    也很高兴了解 ack2.0,如果您必须经常过滤文件,可以在 .ackrc file 中指定这些选项。

    【讨论】:

      【解决方案5】:

      如果您想排除特定文件夹,以下命令可能对您有所帮助:

      ack keywords --ignore-dir folder_name

      man ack 将提供更多详细信息:)

      --[no]ignore-dir=DIRNAME,--[no]ignore-directory=DIRNAME

      --ignore-file=FILTERTYPE:FILTERARGS

      【讨论】:

        猜你喜欢
        • 2013-01-19
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        相关资源
        最近更新 更多