2016-05-03 3 views
0

現在のディレクトリからの相対パスを指定してファイルのフルパスを計算する必要があります。シェル内のPWDと相対パスからフルパスを計算する(リンクあり)

realpathまたはcygpath(私はCygwinにありますが、これはすべての* nixに当てはまるはずです)はパスにシンボリックリンクがあるため動作しません。

bash/shのパス文字列で「算術」を行う簡単な方法はありますか?本質的には

私は正規表現の

/home/me/dir + ../../you/folder = /home/you/folder 

答えて

0
HERE=`pwd` 
THERE=../../there/dir 
while echo $THERE | grep '^\.\./' > /dev/null ; do 
    THERE=`echo $THERE | sed -e 's_^\.\./__'` 
    HERE=`echo $HERE | sed -e 's_/[^/]\+$__'` 
done 
THERE=$HERE/$THERE 
echo $THERE 

翻訳をしたい:ライン^、試合の初めに2つのリテラルのドットがスラッシュ\.\./

マッチスラッシュ/続きますスラッシュでない1つ以上の\+文字で[^/]と続き、末尾に$

+0

$ HEREがスラッシュで終わっていれば、それは壊れてしまいます。確かに、ループの前に次の行を追加することができます: 'THERE = \' echo $ THERE | sed -e 's/$ __' \ '' –

+0

私はバグがあったので私の答えを更新しました。正規表現では、 '.'はワイルドカードなので' ../ 'は' ab/'のように一致します。パターンを '\。\ ./'に変更したので、リテラル '.'だけと一致します。 –

0

"算術計算"なしでシンプルで効率的な方法は、システムにあなたに希望するパスを伝えることです。あなたのシェルがBashの場合:

TGTFNAME="../../you/folder" 
TGTPATH=$(cd "`dirname $TGTFNAME`" 2>/dev/null; pwd; cd - >/dev/null 2>&1;) 
関連する問題