2007年3月19日星期一

A Newbie's Scripts for Cygwin 2

一个获得相对路径的脚本
小例子:

$ getrelpath d:/HelloWorld/b d:/HelloWorld/a/bbb/c.jpg
../a/bbb/c.jpg


源文件:

#!/usr/bin/bash
# get relative pathname of a file from a given dir
# Michael.Fantasia@Gmail.com

if [ "$#" -ne "2" ]
then
    echo "Usage: $(basename $0) dirname filename" >&2
    exit 1
fi

dirname=$(echo $1/ | sed 's@/*$@/@')
if [ -d "$2" ]
then
    filename=$(echo $2/ | sed 's@/*$@/@')
else
    filename=$2
fi
path='[^/]*/'
i=1

while [ "$i" -ne "0" ]
do
    pathdir=$(k=0;while [ "$k" -lt "$i" ];do echo -n $path;let k=$k+1;done)
    str1=$(expr "$dirname" : '\('"$pathdir"'\)')
    str2=$(expr "$filename" : '\('"$pathdir"'\)')
    if [ "$str1" != "$str2" -o -z "$str1" ]
    then
        let i=$i-1
        break
    fi
    let i=$i+1
done

if [ "$i" -eq "0" ]
then
    echo $2
    exit 0
fi

pathdir=$(k=0;while [ "$k" -lt "$i" ];do echo -n $path;let k=$k+1;done)
str1=$(echo $(expr "$dirname" : "$pathdir"'\(.*\)')/ | sed 's@/*$@/@;s@[^/]\+@\.\.@g')
str2=$(expr "$filename" : "$pathdir"'\(.*\)')
echo $str1$str2 | sed 's@^/@\./@'

exit 0

没有评论: