Say I have a folder with three files:


1. If I run

list_of_files=$(print foo*)
echo $list_of_files

I get: foo1 foo2

2. If I run

list_of_files=$(print bar*)
echo $list_of_files

I get: bar

3. However, if I run

list_of_files=$(print other*)
echo $list_of_files

I get: zsh: no matches found: other* (the variable $list_of_files is empty though)

Is there a way to ask zsh to not complain if it can't match a glob expansion?

My goal is to use the mechanism above to silently collect a list of files that match a given glob pattern.


Turn on the null_glob option for your pattern with the N glob qualifier.


If you're doing this on all the patterns in a script or function, turn on the null_glob option:

setopt null_glob

This answer has bash and ksh equivalents.

Do not use print or command substitution! That generates a string consisting of the file names with spaces between them, instead of a list of strings. (See What is word splitting? Why is it important in shell programming?)


The better way: for a in *(.N); do ... ; done. The N option makes zsh deliver an empty list to for, and for will iterate zero times.

Watch out for ls *.foo(.N); when ls receives an empty argument list, it lists all files instead of none. This is why I don't like NULL_GLOB (or its bash equivalent): It changes all the globs and easily breaks calls to e.g. ls.

  • Fancy seeing your answer here @arnt, this is just what I needed. – gtd Feb 4 '17 at 19:41
  • Why the . in (.N)? Other answers have (N) by itself, what is the difference? – Michael Dorst Apr 17 at 16:31
  • The question was about files, and . restricts the glob to match only files. – arnt Apr 17 at 16:46

I think you are looking for the NULL_GLOB option:

          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

Try this way:

list_of_files=$(print other*) 2>/dev/null

It will redirect error output from stderr to /dev/null and it won't display.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.