Globbing/pathname expansion with colon as separator

我的未来我决定 提交于 2019-12-18 11:23:10

问题


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.


回答1:


Actually, I thought of a better solution: use a shell function.

function join() {
    local IFS=$1
    shift
    echo "$*"
}

mystring=$(join ':' /var/lib/gems/*/bin)



回答2:


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



回答3:


PATH="$(printf "%s:" /usr/*/bin)"
PATH="${PATH%:}"



回答4:


printf "%s\n" /var/lib/gems/*/bin | tr "\n" ":"



回答5:


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.




回答6:


without saving IFS and command substitution

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



回答7:


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.




回答8:


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

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



来源:https://stackoverflow.com/questions/3430569/globbing-pathname-expansion-with-colon-as-separator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!