2011-01-09 12 views

Antwort

19

Verwendung readlink:

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

Beachten Sie, dass diese symbolische Links canonicalize wird. Wenn das nicht das, was Sie wollen, verwenden sed:

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

Könnte 'verwenden readlink -m' statt und die Verzeichnis muss nicht existieren. –

+0

@Ryan Li Danke, das ist in der Tat viel besser. Aktualisiert. – phihag

+0

Danke. Ich habe bereits 'sed 's \ \ \ \ // \ // g'' versucht, was nicht so funktioniert, wie ich es möchte. – casper

0
  1. Überlegen Sie, ob Sie dies tun müssen. Unter Unix doppelte Pfadtrenn spezifizieren (und sogar Dinge wie /foo/.//bar///hello/./world gut funktionieren.
  2. können Sie readlink -f verwenden, aber das wird auch die Symlinks in diesem Pfad canonicalize, so das Ergebnis hängt von Ihrem Dateisystem und der Pfad geliefert werden, müssen tatsächlich existieren ...., so wird dies nicht für virtuelle Pfade arbeiten
+0

die meisten der Zeit, zusätzliche Schrägstriche funktionieren gut, aber in einigen Fällen verursachen sie Probleme (ich hatte einmal das mit einer Rsync-Option nicht richtig funktioniert, wenn der Pfad Schrägstriche verdoppelt hatte) – steabert

-4

Danke für die replys ich weiß, dass der Weg funktioniert ich will das nur aus optischen Gründen

fand ich eine andere Lösung: echo $p | replace '//' ''

6

Verwendung von reinem Bash:

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

Dies funktioniert mit mehreren Separatoren und nicht davon ausgehen, den angegebenen Pfad existieren sollte:

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

Aber vereinfacht nicht gut Zeichenfolge mit ".."

2

Mit realpath:

realpath -sm $p

Parameter:

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

Ihre Eingabe:

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

Befehl die irrelevanten Schrägstriche zu entfernen:

echo $p | tr -s/

Ausgang:

/foo/bar/hello/world 
Verwandte Themen