Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Some problems with recursive globbing



I am trying to write a function where I collect files within a file tree to
do some processing.

My goal is to find all files which are not in any directory called
'target', at any level.

Here's a simplified version of my function:

myfiles() {
    setopt LOCAL_OPTIONS EXTENDED_GLOB

    local dir

    [[ -n $1 ]] && dir=${1:a}/

    local filepattern="${dir}**/*~${dir}(**/|)target(/**/*|/*|)"

    print -c ${~filepattern}
}

So this prints out the relative paths of all files in the current
directory. If a directory is given as an argument, the absolute paths are
printed of files within the given directory. (I know there's no check that
the argument is actually a directory).

This works, sort of, but I have a question and a problem.

Question: I found it surprisingly difficult to to find a glob pattern that
excluded target directories and their contents at all levels. Have I
complicated this too much, is there an easier way to express this glob?

Problem: I can't get this to work for both cases of a) directories with
spaces in their names and b) directories with parenthesis in their names

Suppose I'm standing in a directory called "/tmp/test(1)", and this
directory contains a directory called "src".

% myfiles src

I get this:

myfiles:9: no matches found:
/tmp/test(1)/src/**/*~/tmp/test(1)/src/(**/|)target(/**/*|/*|)

If I change the fifth line in myfiles() to this:

  [[ -n $1 ]] && dir=${(q)1:a}/

it works for the root directory with parentheses. However, standing in a
directory called "/tmp/test 1", I now get this:

myfiles:9: no matches found: /tmp/test\ 1/src/**/*~/tmp/test\
1/src/(**/|)target(/**/*|/*|)

So with quoting, it works with parentheses. Without quoting, it works with
spaces. It feels as though I've tried everything, but I can't find a way to
quote this so that it works for both parentheses and spaces.


Messages sorted by: Reverse Date, Date, Thread, Author