2011-01-09 16 views

Odpowiedz

19

Zastosowanie readlink:

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

Zauważ, że to będzie kanonicznej dowiązania symboliczne. Jeśli to nie to, co chcesz, skorzystaj sed:

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

Przydałoby 'readlink -m' zamiast, a katalog nie musi istnieć. –

+0

@Ryan Li Dzięki, to rzeczywiście dużo lepsze. Zaktualizowano. – phihag

+0

Dzięki. Próbowałem już 'sed 's/\/\ // \ // g'' który nie działał tak, jak chcę. – casper

0
  1. rozważenia, jeśli chcesz to zrobić. W systemie Unix określenie duplikatów separatorów ścieżek (a nawet rzeczy takie jak /foo/.//bar///hello/./world działają bez zarzutu
  2. Można użyć readlink -f, ale to również kanonizuje dowiązania symboliczne w tej ścieżce, więc wynik zależy od systemu plików i podana ścieżka musi faktycznie istnieć ...., więc to nie będzie działać dla wirtualnych ścieżek
+0

przez większość czasu, dodatkowe ukośniki działają dobrze, ale w niektórych przypadkach powodują problemy (miałem kiedyś to z opcją rsync, która nie działała poprawnie, jeśli ścieżka miała podwójne ukośniki) – steabert

-4

Dzięki za replys wiem ścieżka działa prawidłowo chcę tylko to ze względów optycznych

znalazłem inne rozwiązanie: echo $p | replace '//' ''

6

Używanie czystego Basha:

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

ten współpracuje z wieloma separatorami i nie zakładają podanej ścieżki powinny istnieć:

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

Ale czy dobrze nie uprości ciągi zawierające ".."

2

Z realpath:

realpath -sm $p

Parametry:

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

Twój wkład:

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

polecenia w celu usunięcia zbędnych ukośniki:

echo $p | tr -s/

wyjściowa:

/foo/bar/hello/world 
Powiązane problemy