2011-01-09 14 views

Respuesta

19

Uso readlink:

p=$(readlink -m "/foo//////bar///hello/////world") 

Tenga en cuenta que esto canonicalize enlaces simbólicos. Si eso no es lo que desea, utilice sed:

p=$(echo "/foo//////bar///hello/////world" | sed s#//*#/#g) 
+4

podría usar 'readlink -m' su lugar, y el directorio no necesita existir. –

+0

@Ryan Li Gracias, eso es mucho mejor. Actualizado. – phihag

+0

Gracias. Ya probé 'sed 's/\/\ // \ // g'' que no funcionó de la manera que quiero. – casper

0
  1. tener en cuenta si lo que necesita hacer esto. En Unix, especificar separadores de ruta duplicados (e incluso cosas como /foo/.//bar///hello/./world funcionan bien.
  2. Puede usar readlink -f, pero esto también canonicalizará los enlaces simbólicos en esa ruta, por lo que el resultado depende de su sistema de archivos y la ruta de acceso debe existir realmente ...., así que esto no va a funcionar para caminos virtuales
+0

la mayor parte del tiempo, las barras adicionales funcionan bien, pero en algunos casos causan problemas (una vez tuve esto con una opción de sincronización de datos que no funcionaba correctamente si la ruta tenía barras dobles) – steabert

-4

Gracias por los replys sé que el camino funciona bien sólo quiero esto por razones ópticas

he encontrado otra solución: echo $p | replace '//' ''

6

Usando puro Bash:

shopt -s extglob 
echo ${p//\/*(\/)/\/} 
0

Esto funciona con múltiples separadores y no asume la ruta dada debe existir:

p=/foo///.//bar///foo1/bar1//foo2/./bar2; 
echo $p | awk '{while(index($1,"/./")) gsub("/./","/"); while(index($1,"//")) 
    gsub("//","/"); print $1;}' 

Pero no simplifica también contiene cadenas ".."

2

Con realpath:

realpath -sm $p

Parámetros:

-m, --canonicalize-missing no components of the path need exist 
    -s, --strip, --no-symlinks don't expand symlinks 
0

su entrada:

p="/foo//////bar///hello/////world" 

comando para quitar las barras irrelevantes:

echo $p | tr -s/

de salida:

/foo/bar/hello/world 
Cuestiones relacionadas