/home
ファイルとサブディレクトリを指すシンボリックリンクがたくさんあります/foo
。新しいディレクトリをターゲットにしたいです/bar
。
私のアプローチは、すべての無効なシンボリックリンクを見て、彼らが/foo
。
sudo find . -type l -! -exec test -e {} \; -exec sh -c '\
old_link_target=$(readlink "$0"); \
new_link_target=${old_link_target//foo/bar}; \
ln -snf $new_link_target $0' {} \;
しかし、無効なシンボリックリンクに焦点を当てる初期段階を含まないより正確なアプローチが必要です。したがって、この質問には仮定が/foo
残るので、他のアプローチが必要です。
ベストアンサー1
GNUly:
find . -lname '/foo*' -printf '%p\0%l\0' |
awk -vRS='\0' '
{
getline target
sub("^/foo", "/bar", target)
printf("%s\0%s\0", target, $0)
}' |
xargs -r0n2 ln -sfT
または最新のGNUを使用してくださいsed
。
find . -lname '/foo*' -printf '%l\0%p\0' |
sed -z 's|^/foo|/bar|;n' |
xargs -r0n2 ln -sfT
シンボリックリンクの所有権に影響を与える可能性があります(たとえば、シンボリックリンクは自分が所有していないディレクトリにありますが、書き込み権限があり、t
ビットが設定されている場合など/tmp
)。
tar
これを防ぐには、代わりにGNUを使用できます。
find . -lname '/foo*' -print0 |
tar --null -T - -cf - --transform='s@^/foo@/bar@' |
tar xpf -