相対パスが与えられた場合、相対シンボリックリンクを作成する方法は?

相対パスが与えられた場合、相対シンボリックリンクを作成する方法は?

プログラムで相対パスのディレクトリの深さを探したいと思います。たとえば、深さtest/dir/helloは3です。

より具体的には、親ディレクトリにあるファイルへのシンボリックリンクを作成できるようにディレクトリの深さが必要です。

${current_path}次の2つのパラメータがあります。${parent_file_to_lunk}

${current_path}相対シンボルファイルを生成できるようにディレクトリの深さをどのように決定しますか${parent_file_to_lunk}

これに似ていますが、../ディレクトリの深さほど:

cd ${current_path} ; ln -s ../$parent_file_to_link}

答え1

努力する

parent_path=$(echo "$current_path"/ | sed -e "s|[^/]||g" -e "s|/|../|g")
cd "${current_path}" ; ln -s "${parent_path}${parent_file_to_link}"

計算にスラッシュを入れるだけです"${current_path}"。必要な深さはスラッシュ数より1が大きいため(たとえば、test/dir/hello2つのスラッシュのバージョンの深さは3です)、1つのスラッシュを追加するだけですecho "$current_path"/sedスラッシュを操作しているので、コマンドの区切り文字として他の文字を使用する方が簡単です/ 。私はパイプ()を使うのが好きです。スラッシュ以外のすべての文字を見つけて、null文字に置き換えます。つまり、スラッシュを除くすべての文字を削除します。だから の値を に切りました。次に、それぞれをに変更すると、次のようになります。seds|s|[^/]||g"${current_path}"test/dir/helloechotest/dir/hello////s|/|../|g"/../../../../

注:これは"${current_path}" 重複した(不要な)スラッシュがないと仮定します。たとえば、test/dir//helloおよびはtest/dir/hello/ 論理的に同じですtest/dir/helloが、誤解を招く数のスラッシュ文字が含まれているため、プロセスは中断されます。

PS:引用しない理由がなく、自分が何をしているのかを知らない限り、常にすべてのシェル変数を引用してください。中かっこ(例:)の使用は引用と同じではありません。${variable_name}

答え2

このようなことがうまくいくはずです

file="/var/log/dmesg"
ln -s $file $(dirname $file)/../

答え3

一つを作りたいとしましょう。

/home/kostas/test/dir/hello/link -> /home/kostas/file/to/link

シンボリックリンク(/home/kostas現在のディレクトリを想定)、しかし相対リンクを使用する:

/home/kostas/test/dir/hello/link -> ../../../file/to/link

その後、次のことができます(GNUを使用ln)。

$ current_path=test/dir/hello
$ parent_file_to_lunk=file/to/link
$ ln -rsvt "$current_path/" "$parent_file_to_lunk"
‘test/dir/hello/link’ -> ‘../../../file/to/link’

GNUはありませんが、GNUまたはln以下があります。bash -O extglobzsh -o kshglobksh93

$ ln -s "${current_path//+([^\/])/..}/$parent_file_to_lunk" "$current_path/"

(ここで想定するコンポーネントは$current_pathシンボリックリンク自体ではありません。)

関連情報