プログラムで相対パスのディレクトリの深さを探したいと思います。たとえば、深さ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/hello
2つのスラッシュのバージョンの深さは3です)、1つのスラッシュを追加するだけですecho "$current_path"/
。sed
スラッシュを操作しているので、コマンドの区切り文字として他の文字を使用する方が簡単です/
。私はパイプ()を使うのが好きです。スラッシュ以外のすべての文字を見つけて、null文字に置き換えます。つまり、スラッシュを除くすべての文字を削除します。だから の値を に切りました。次に、それぞれをに変更すると、次のようになります。sed
s
|
s|[^/]||g
"${current_path}"
test/dir/hello
echo
test/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 extglob
zsh -o kshglob
ksh93
$ ln -s "${current_path//+([^\/])/..}/$parent_file_to_lunk" "$current_path/"
(ここで想定するコンポーネントは$current_path
シンボリックリンク自体ではありません。)