Расширение Globbing/pathname с двоеточием как разделитель

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

/var/lib/gems/*/bin

в разделенную от двоеточия строку имен файлов (т.е. совместимый Путь) соответствие шаблону?

т.е. 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, но это не работает, если само имя файла содержит пробел.

19
задан mjs 7 August 2010 в 13:16
поделиться

5 ответов

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

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

mystring=$(join ':' /var/lib/gems/*/bin)
20
ответ дан 30 November 2019 в 03:11
поделиться
printf "%s\n" /var/lib/gems/*/bin | tr "\n" ":"
2
ответ дан 30 November 2019 в 03:11
поделиться
PATH="$(printf "%s:" /usr/*/bin)"
PATH="${PATH%:}"
5
ответ дан 30 November 2019 в 03:11
поделиться

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

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
11
ответ дан 30 November 2019 в 03:11
поделиться

Это довольно тривиально, если вы зайдете в 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
ответ дан 30 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: