home *** CD-ROM | disk | FTP | other *** search
- #!/bin/sh
- # $0 from to
- # Find a relative path from "to" to "from"
- # ie. a path which can be used in "from" to get to "to".
- # Example: $0 x/y/z a/b -> ../../../a/b
- # Example: $0 /x/y/z a/b -> /x/y/z
- # Example: $0 x/../y/z a/b -> ../../a/b
- # Example: $0 x/y/../z a/b -> ../../a/b
- # Example: $0 x/./y/z a/b -> ../../../a/b
- # Example (in x): $0 ../y/z a/b -> ../../x/a/b
-
- gawk 'BEGIN {
- from=ARGV[1];
- to=ARGV[2];
-
- prefix="";
-
- gsub (/\/$/,"",from);
-
- first=1;
- cddir=".";
-
- if (substr(from,1,1)=="/")
- print from
- else
- {
- while (from!="")
- {
- if (!match(from,/^[^/]+/))
- {
- from=substr(from,2);
- }
- else
- {
- dir=substr(from,RSTART,RLENGTH);
- from=substr(from,RSTART+RLENGTH+1);
-
- if (dir!="..")
- first=0;
-
- if (dir != "." && dir != "..")
- {
- prefix=prefix "../";
- }
- else if (dir=="..")
- {
- if (first)
- {
- cmd="cd " cddir " ; pwd";
- cmd | getline;
- close (cmd);
- path=$1;
- gsub(/.*\//,"",path);
- to=path "/" to;
- cddir=cddir "/..";
- }
- else
- prefix=substr(prefix,4);
- }
- }
- }
-
- print prefix to
- }
- }' $1 $2
-