【问题标题】:How to find/grep all paths where directory name matches "x" but not "y" on *nix?如何在 *nix 上查找/grep 目录名称匹配“x”但不匹配“y”的所有路径?
【发布时间】:2012-08-28 15:43:10
【问题描述】:

我有一个这样的文件夹结构(这是一个小的 sn-p):

└── test
    └── cases
        └── model
            ├── client
            │   ├── socketsTest.coffee
            ├── server
            │   └── socketsTest.coffee
            └── shared
                └── findersTest.coffee

问题是,如何列出所有以.coffee 结尾且不存在于client 文件夹中的路径?

以下命令返回存在于server 文件夹中的与.coffee 匹配的所有文件:

find test -name "*Test.coffee" | egrep '/*server*/'

但我真正需要的是一个匹配所有除了客户端文件夹中的内容的正则表达式。

在 *nix 上最简洁的方法是什么?最终目标是返回不在client 文件夹内的文件,因此对于上面的树来说:

$ <find files except those a client folder>
test/cases/model/server/socketsTest.coffee
test/cases/model/shared/findersTest.coffee

我尝试做这样的事情但没有运气:

find test -name "*Test.coffee" | egrep '*model/[^client]*'

【问题讨论】:

    标签: linux shell unix find grep


    【解决方案1】:

    您可以使用-prune 操作来忽略目录。 -o 表示“或”,因此读作“如果它被命名为客户端,则修剪它,否则打​​印名为 *.coffee 的文件”。

    find test -name client -prune -o -name '*.coffee' -print
    

    或者您可以使用双重测试,它更易于阅读但效率稍低,因为它会递归到 client/ 目录,而第一个则完全避免它们。

    find test -name '*.coffee' ! -wholename '*/client/*'
    

    【讨论】:

      【解决方案2】:

      我会支持 John Kugelman 给出的-prune 答案。

      使用grep 解决此问题的另一种方法是使用-v 选项:

      find test -name "*Test.coffee" | grep -v client
      

      -v 反转模式匹配,因此所有包含“客户端”的匹配都被丢弃

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-04
        • 2021-04-17
        • 1970-01-01
        • 2013-01-07
        • 2018-05-15
        • 2020-06-30
        • 2020-10-16
        • 1970-01-01
        相关资源
        最近更新 更多