(同じディレクトリにある)他のターゲットを指すようにターゲットのすべてのシンボリックリンクを置き換えるスクリプト

(同じディレクトリにある)他のターゲットを指すようにターゲットのすべてのシンボリックリンクを置き換えるスクリプト

次のような人工的な例を見てください。

$ mkdir -p a/b && touch a/b/original-target && touch a/b/new-target
$ mkdir -p c1/c2 && cd c1/c2 && ln -s ../../a/b/original-target && cd -
$ mkdir -p d1/d2/d3 && cd d1/d2/d3 && ln -s ../../../a/b/original-target && cd -
$ tree .
.
├── a
│   └── b
│       ├── new-target
│       └── original-target
├── c1
│   └── c2
│       └── original-target -> ../../a/b/original-target
└── d1
    └── d2
        └── d3
            └── original-target -> ../../../a/b/original-target

すべてのシンボリックリンクoriginal-targetnew-target。シンボリックリンクは相対パスを使用する必要があります。

ベストアンサー1

globstar私はあなたがbashを使用すると**仮定しているので。その後残ったのは少し遊んでreadlink待つことですrealpath

shopt -s globstar
for file in c1/** d1/**; do
    if [[ -h "$file" ]]; then
        if [[ "$(readlink -f "$file")" == "$(realpath a/b/original-target)" ]]; then
            ln -sf "$(dirname "$(readlink "$file")")"/new-target "$(dirname "$file")" && rm -f "$file"
        fi
    fi
done

おすすめ記事