Globbing/pathname expansion with colon as separator

Viewed 7359

How can I convert a string containing glob characters such as

/var/lib/gems/*/bin

into a colon-separated string of filenames (i.e. PATH compatible) matching the pattern?

i.e. echo /var/lib/gems/*/bin will return

/var/lib/gems/1.8/bin /var/lib/gems/1.9.1/bin

I want

/var/lib/gems/1.8/bin:/var/lib/gems/1.9.1/bin 

instead.

The obvious approach is simply to replace the space character with ':' via tr, but that doesn't work if the filename itself contains the space character.

8 Answers

No need to mess with IFS, zsh can join arrays with a simple variable flag:

dirs=(/var/lib/gems/*/bin(N))
dirs=${(j.:.)dirs}

The (N) on the first line suppresses a warning if there are no files; the (j.:.) joins the array with :s. Works with 0, 1, or multiple matches.

without saving IFS and command substitution

dirs=(/var/lib/gems/*/bin) ; IFS=: eval 'dirs="${dirs[*]}"'

Another oneliner: printf "%s\n" /var/lib/gems/*/bin | paste -s -d':'

But @timo's answer is better in my opinion.

Related