7

我有一个这样的文件夹结构(这是一个小片段):

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

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

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

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]*'
4

2 回答 2

11

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

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

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

find test -name '*.coffee' ! -wholename '*/client/*'
于 2012-09-04T01:30:47.497 回答
1

-prune赞成约翰·库格曼给出的答案。

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

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

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

于 2012-09-04T01:44:13.807 回答