bashshellgnu-findutils

Find file recursively excluding subfolders with specific substring


I need to get all paths which has a specific file:

find apps  -type f -name "project.json"

This returns something like

apps/sub/frontend-e2e/project.json
apps/sub/frontend/project.json
apps/sub/backend/project.json

But I want to exclude all paths with -e2e in the last folder.

I tried something like

find apps  -type f -name "project.json" -not \( -path "*-e2e" -prune \)

Also I need to remove apps/ and /project.json from the beginning and the end of each path. So the result should be:

sub/frontend
sub/backend

In JS I would do

glob.sync('apps/**/project.json', {
    ignore: ['apps/**/*-e2e/project.json']
}).map((path) => {
    // do replacements
})

Solution

  • If you've got Bash 4.3 (released in 2014) or later, try this Shellcheck-clean code:

    shopt -s dotglob extglob globstar nullglob
    for path in apps/**/!(*-e2e)/project.json; do
        p=${path#*/}
        printf '%s\n' "${p%/*}"
    done
    

    Note that this code will not output anything for the path apps/project.json. It's not clear what you would want to output in that case anyway.