saber ruta programas para obtener nombre listar ejercicios ejemplos directorio con completa como comando archivos archivo bash shell path glob expansion

bash - programas - Extensión de globbing/nombre de ruta con dos puntos como separador



obtener nombre de archivo shell (6)

¿Cómo puedo convertir una cadena que contiene caracteres globales como

/var/lib/gems/*/bin

en una cadena de nombres de archivos separados por dos puntos (es decir, compatible con PATH) que coincidan con el patrón?

es decir, echo /var/lib/gems/*/bin volverá

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

yo quiero

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

en lugar.

El enfoque obvio es simplemente reemplazar el carácter de espacio por '':'' a través de tr , pero eso no funciona si el nombre de archivo contiene el carácter de espacio.


Es muy trivial si te dejas caer en Perl:

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

O Python:

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

O cualquier cantidad de otros lenguajes de scripting populares.


Esto debería hacerlo por usted:

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


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


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


En realidad, pensé en una solución mejor: usar una función de shell.

function join() { local IFS=$1 shift echo "$*" } mystring=$(join '':'' /var/lib/gems/*/bin)


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

Pero la respuesta de @timo es mejor en mi opinión.