スクリプトを介してシンボリックリンクを更新しますか? [コピー]

スクリプトを介してシンボリックリンクを更新しますか? [コピー]

他のディレクトリへの多くのシンボリックリンクを含むディレクトリがあります。これで、シンボリックリンクを介してリンクされたディレクトリの共通祖先ディレクトリの名前を変更し、シンボリックリンクが同じディレクトリ(名前が変更されたパス名に加えて)を指すようにしたいと思います。たとえば、シンボリックリンクが/home/Tim/dir1、、、...を指しています。今、シンボリックリンクが、、...を/home/Tim/dir2指すようにしたいと思います。/data/Tim/dir1/data/Tim/dir2

シンボリックリンク更新プロセスを自動化したいと思います。しかし、いくつかの問題があります:

  1. シンボリックリンクは編集が不可能だと聞きました。それでは、新しいシンボリックリンクを作成してから既存のシンボリックリンクを上書きする必要がありますか?

  2. シンボリックリンクが指すディレクトリのパス名を取得し、いくつかのテキスト処理プログラムを使用してパス名の祖先ディレクトリの古い名前を新しい名前に変更し、新しい名前を使用してそのディレクトリを指すシンボリックリンクを作成するには?ありがとうございます。

ベストアンサー1

シンボリックリンクは編集が不可能だと聞きました。それでは、新しいシンボリックリンクを作成してから既存のシンボリックリンクを上書きする必要がありますか?

シンボリックリンクは編集できません。そうですね。-fオプションを使用すると、単一の操作でファイルのシンボリックリンクを置き換えることができます。追加されたln場合は-T、同じ方法でディレクトリへのシンボリックリンクを処理できます。

ln -sfT /data/Tim/dir1 symlink1

symlink1を指す/data/Tim/dir1既存のシンボリックリンク(またはファイル!)を置き換えることによって生成されますsymlink1

シンボリックリンクが指すディレクトリのパス名を取得し、いくつかのテキスト処理プログラムを使用してパス名の祖先ディレクトリの古い名前を新しい名前に変更し、新しい名前を使用してそのディレクトリを指すシンボリックリンクを作成するには?

realpathシンボリックリンクが指す絶対パスを提供します。シンボリックリンクを処理するには:

for symlink in *; do
    if [ -L "${symlink}" ]; then
        origpath="$(realpath "${symlink}")" && ln -sfT "${origpath/home/data}" "${symlink}"
    fi
done

これにより、現在のディレクトリ内のすべてのファイルへのパスを検索し(したがって、現在のディレクトリ内のすべてのシンボリックリンクを変更する必要があると仮定します)、それを再接続して最初のエントリを検索しhomeますdata。交換済み(対象がない場合は失敗)&&realpath

おすすめ記事