2011-01-09 27 views

Trả lời

19

Sử dụng readlink:

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

Chú ý rằng điều này sẽ canonicalize liên kết tượng trưng. Nếu đó không phải là những gì bạn muốn, sử dụng sed:

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

thể sử dụng 'readlink -m' thay vào đó, và thư mục không cần phải tồn tại. –

+0

@Ryan Li Cảm ơn, đó thực sự là cách tốt hơn. Đã cập nhật. – phihag

+0

Cảm ơn. Tôi đã thử 'sed 's/\/\ // \ // g'' mà doesnt làm việc theo cách tôi muốn. – casper

0
  1. Hãy xem xét nếu bạn cần phải làm điều này. Trên Unix, chỉ định các đường phân tách đường dẫn trùng lặp (và thậm chí cả những thứ như /foo/.//bar///hello/./world chỉ hoạt động tốt.
  2. Bạn có thể sử dụng readlink -f, nhưng điều này cũng sẽ hợp chuẩn hóa các liên kết tượng trưng trong đường dẫn đó, do đó kết quả phụ thuộc vào hệ thống tệp của bạn và đường dẫn được cung cấp phải tồn tại ...., vì vậy đây sẽ không làm việc cho đường dẫn ảo
+0

hầu hết thời gian, dấu gạch chéo thêm làm việc tốt, nhưng trong một số trường hợp chúng gây ra vấn đề (tôi đã từng có điều này với một tùy chọn rsync không hoạt động chính xác nếu đường dẫn đã tăng gấp đôi dấu gạch chéo) – steabert

-4

Cảm ơn replys tôi biết con đường hoạt động tốt tôi chỉ muốn điều này vì những lý do quang

tôi tìm thấy một giải pháp: echo $p | replace '//' ''

6

Sử dụng tinh khiết Bash:

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

này hoạt động với nhiều dải phân cách và không giả định con đường cho nên tồn tại:

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

Nhưng không đơn giản hóa cũng chứa chuỗi ".."

2

Với realpath:

realpath -sm $p

Tham số:

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

đầu vào của bạn:

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

lệnh để loại bỏ các dấu gạch chéo không liên quan:

echo $p | tr -s/

đầu ra:

/foo/bar/hello/world 
Các vấn đề liên quan