Reputation: 65343
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.
Upvotes: 24
Views: 9255
Reputation: 56129
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.
Upvotes: 4
Reputation: 618
without saving IFS and command substitution
dirs=(/var/lib/gems/*/bin) ; IFS=: eval 'dirs="${dirs[*]}"'
Upvotes: 3
Reputation: 1908
Another oneliner: printf "%s\n" /var/lib/gems/*/bin | paste -s -d':'
But @timo's answer is better in my opinion.
Upvotes: 1
Reputation: 29790
Actually, I thought of a better solution: use a shell function.
function join() {
local IFS=$1
shift
echo "$*"
}
mystring=$(join ':' /var/lib/gems/*/bin)
Upvotes: 20
Reputation: 29790
It's pretty trivial if you drop into Perl:
perl -e 'print join ":", @ARGV' /var/lib/gems/*/bin
Or Python:
python -c 'import sys; print ":".join(sys.argv[1:])' /var/lib/gems/*/bin
Or any number of other popular scripting languages.
Upvotes: 4
Reputation: 360495
This should do it for you:
dirs=(/var/lib/gems/*/bin) # put filenames (dirnames) in an array
saveIFS=$IFS IFS=':' # set the Internal Field Separator to the desired delimiter
dirs=("${dirs[*]}") # convert the array to a scalar with the new delimiter
IFS=$saveIFS # restore IFS
Upvotes: 13