シンボリックリンクは、ネストされたシンボリックリンクを生成します。

シンボリックリンクは、ネストされたシンボリックリンクを生成します。

私がアクセスできないディレクトリで実行されている他のチームの誰かのためにシンボリックリンクスクリプトを作成しました。

destination_path=/path/to/dest/
source_path=/path/to/src

for dir in first second
do
    # replace existing symlink
    for subdir in {1000..1020}
    do 
        ln -sf $source_path/$dir/$subdir $destination_path/$dir/$subdir
    done
done

スクリプトが実行される前に、他のディレクトリセットへのシンボリックリンクをpath/to/dest/$dir含めてください。1000, 1001, ..., 1020私のスクリプトは、これらのシンボリックリンクをシンボリックリンクに置き換えるように設計されていますが、/path/to/src/$dir/$subdirそうではなく、代わりに既存のシンボリックリンク内にシンボリックリンクを作成します。

たとえば、/path/to/dest/$dir/1000以前にシンボリックリンクであったのは、スクリプトを実行した後も/path/to/dest/$dir/1000まだ同じ場所を指しますが、内部にはそれを指すシンボリックリンクが/path/to/dest/$dir/1000あります。1000$source_path/$dir/$subdir/1000

私のスクリプトではこれは起こらないでください。そうですか?シミュレートされたターゲットディレクトリ構造を使用してローカルで問題を再現しようとしましたが、問題を再現できませんでした。

ln -sfn編集:追加の調査でln -sfこの問題を解決する最も簡単な方法は何ですか?

ベストアンサー1

ディレクトリを指すシンボリックリンクは(ほぼ常に)そのディレクトリとして扱われます。通常、シンボリックリンクを更新するには、そのリンクを削除して再作成してください。

このようなスクリプトバリアントを使用してください。

#!/bin/bash
destination_path='/path/to/dest/'
source_path='/path/to/src'

for dir in first second
do
    # replace existing symlink
    for subdir in {1000..1020}
    do 
        s="$source_path/$dir/$subdir"
        t="$destination_path/$dir/$subdir"

        [ -d "$t" ] && [ -h "$d/$subdir" ] && echo rm -f -- "$d/$subdir"
        [ -h "$d" ] && echo rm -f -- "$d"
        echo ln -sf -- "$s" "$d"
    done
done

echo必要なタスクを実行するのに満足している場合は、3つのインスタンスをすべて削除してください。

おすすめ記事