他のディレクトリへの多くのシンボリックリンクを含むディレクトリがあります。これで、シンボリックリンクを介してリンクされたディレクトリの共通祖先ディレクトリの名前を変更し、シンボリックリンクが同じディレクトリ(名前が変更されたパス名に加えて)を指すようにしたいと思います。たとえば、シンボリックリンクが/home/Tim/dir1
、、、...を指しています。今、シンボリックリンクが、、...を/home/Tim/dir2
指すようにしたいと思います。/data/Tim/dir1
/data/Tim/dir2
シンボリックリンク更新プロセスを自動化したいと思います。しかし、いくつかの問題があります:
シンボリックリンクは編集が不可能だと聞きました。それでは、新しいシンボリックリンクを作成してから既存のシンボリックリンクを上書きする必要がありますか?
シンボリックリンクが指すディレクトリのパス名を取得し、いくつかのテキスト処理プログラムを使用してパス名の祖先ディレクトリの古い名前を新しい名前に変更し、新しい名前を使用してそのディレクトリを指すシンボリックリンクを作成するには?ありがとうございます。
答え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