Sign up ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It's 100% free, no registration required.

I need to expand a glob pattern (like ../smth*/*, or /etc/cron*/) into a list of files, programmatically. What would be the best way to do it?

share|improve this question
You don't need to do anything special, just don't quote the *. – Kevin Mar 12 '12 at 14:32
Though if you're going to be trying to parse it, use an array like the answer says. – Kevin Mar 12 '12 at 14:34

1 Answer 1

up vote 13 down vote accepted

Just let it expand inside an array declaration's right side:

bash-4.2# list=(../smth*/)          # grab the list

bash-4.2# echo "${#list[@]}"        # print array length

bash-4.2# echo "${list[@]}"         # print array elements

bash-4.2# for file in "${list[@]}"; do echo "$file"; done  # loop over the array

Note that the shell option nullglob needs to be set.
It is not set by default.
It prevents an error in case the glob (or one of multiple globs) does not match any name.

Set it in bash with

shopt -s nullglob

or in zsh with

setopt nullglob
share|improve this answer
And how do I print that list afterwards? – Rogach Mar 12 '12 at 13:38
It is just a regular array. You can do whatever you can with any array. Added some examples. – manatwork Mar 12 '12 at 13:44
There is a problem. If pattern matches no files, it prints itself - which is not very good. – Rogach Mar 12 '12 at 14:21
Ah, shopt -s nullglob solves it. – Rogach Mar 12 '12 at 14:25

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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