すべてのマルチホップシンボリックリンクを再帰的に再接続し、最終的な宛先に直接接続します。

すべてのマルチホップシンボリックリンクを再帰的に再接続し、最終的な宛先に直接接続します。

中間子リンクを再帰的に削除する方法は?たとえば、

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

関連情報