Глобирование / расширение пути с двоеточием в качестве разделителя - PullRequest
18 голосов
/ 07 августа 2010

Как я могу преобразовать строку, содержащую символы глобуса, такие как

/var/lib/gems/*/bin

, в строку имен файлов, разделенных двоеточиями (т. Е. Совместимых с PATH), соответствующих шаблону?

т. Е. echo /var/lib/gems/*/binвернет

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

Я хочу

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

.

Очевидный подход заключается в простой замене пробела на ':' через tr, ноэто не работает, если само имя файла содержит символ пробела.

Ответы [ 8 ]

19 голосов
/ 09 августа 2010

На самом деле, я подумал о лучшем решении: использовать функцию оболочки.

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

mystring=$(join ':' /var/lib/gems/*/bin)
10 голосов
/ 07 августа 2010

Это должно сделать это для вас:

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
4 голосов
/ 07 августа 2010
PATH="$(printf "%s:" /usr/*/bin)"
PATH="${PATH%:}"
2 голосов
/ 08 августа 2010

Это довольно тривиально, если вы перейдете на Perl:

perl -e 'print join ":", @ARGV' /var/lib/gems/*/bin

или Python:

python -c 'import sys; print ":".join(sys.argv[1:])' /var/lib/gems/*/bin

или на любое количество других популярных языков сценариев.

2 голосов
/ 07 августа 2010
printf "%s\n" /var/lib/gems/*/bin | tr "\n" ":"
1 голос
/ 02 января 2019

Не нужно связываться с IFS, zsh может объединять массивы с простым переменным флагом:

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

(N) в первой строке подавляет предупреждение, если нет файлов;(j.:.) объединяет массив с : с.Работает с 0, 1 или несколькими совпадениями.

1 голос
/ 11 декабря 2018

без сохранения IFS и подстановки команд

dirs=(/var/lib/gems/*/bin) ; IFS=: eval 'dirs="${dirs[*]}"'
0 голосов
/ 22 сентября 2017

Еще один лайнер: printf "%s\n" /var/lib/gems/*/bin | paste -s -d':'

Но, на мой взгляд, ответ @ timo лучше.

...