中間子リンクを再帰的に削除する方法は?たとえば、
somelink -> someintermediarylink -> actualfile.txt
なります
somelink -> actualfile.txt
ディレクトリとサブディレクトリ内のすべてのファイルに対して(つまり、再帰的に)
アイデアはありますか?
答え1
GNUツールの使用:
find . -type l ! -xtype l -exec sh -c '
for link do
target=$(readlink -e -- "$link") &&
ln -svTf -r -- "$target" "$link"
done' sh {} +
壊れていないすべてのシンボリックリンクを相対リンクに変更し、ターゲットにシンボリックリンクコンポーネントがありません。
-r
絶対シンボリックリンクが必要な場合は削除してください。
これらのシンボリックリンクが指すファイルの正式な絶対名は改行文字で終わらないと仮定します(コマンド置換の一般的な制限は、すべての末尾の改行文字を削除することです)。
答え2
#!/bin/bash
# Usage: ./relinkToFinalDestination directory_path
directory=$1
find -L $directory -xtype l | while read file; do
next_hop=$(readlink "$file")
if [[ -e $next_hop ]]; then
final=$(readlink -e "$file")
echo "Got final path for $file --> $final"
# Update the link
ln -sf "$final" "$file"
fi
done