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.