1

現在の場所の2つ上のディレクトリにあるファイル「file1」へのシンボリックリンク「file2」を作成するとします(たとえば、「ln -s ../../file1 file2」。ただし、「file1」もシンボリックリンクであるとします。その場所から2つ下のファイル「file0」に移動します(相対パスがdir1 / dir2 / file0であるとします)。

「../../file1」だけでなく、「file1」シンボリックリンクにfile0「../../ dir1 / dir2/file0」への相対URLが含まれているとよいでしょう。後者は間接的にファイルを指すだけです。

これを行うための良い方法は何ですか?

私はreadlinkで何かを一緒にハックすることができました。しかし、私はまだ考えていない、または見落としている「より良い」方法があることを望んでいます。

4

3 に答える 3

1

これにより、ファイルが再帰的にテストされ、完全な相対パスが取得されてから、不要な「./」と「foo/../」が削除されます。

#!/bin/bash
linkfile="$1"
while test -L "$linkfile" ; do
linkfile="$(dirname ${linkfile})/$(readlink ${linkfile})"
done
perl -e '$x=shift; while ($x =~ s#//+#/#g) {} ; while ($x =~ s#/\./#/#g) {} ; while ($x =~ s#/([^\.]|[^\.][^/]+?|\.[^\.]+?)/\.\./#/#g) {} ; while ($x =~ s#^([^\.]|[^\.][^/]+?|\.[^\.]+?)/\.\./#/#g) {} ; $x =~ s#^\./##; print "$x\n";' "$linkfile"

それを「canonical.bash」として保存すると、それを使用します

$ ln -s `canonical.bash foo` bar

正規表現は、「/ .. x /../」や「../foo/」(foo/が$PWDにある場合)などのいくつかのケースを減らすことはありませんが、それ以外の場合は堅牢である必要があります。

于 2011-08-01T03:24:29.177 に答える
0

いいえ、これは非常に具体的であるため、readlinkを使用して自分で実装する必要があると思います。

于 2011-07-23T11:59:05.303 に答える
0

今覚えてる!! 15年ほど前にこれを実現するユーティリティを見ました!参照してくださいman symlinks(1)symlinks -c。これが希望どおりでない場合は、ニーズが非常に具体的であるため、自分でコーディングする必要があると思います...(よく覚えている場合は、ディスク上のシンボリックリンクを処理するためのユーティリティも作成しました...)。PERLはそのための優れた言語です。

于 2011-07-23T13:45:32.090 に答える