私がアクセスできないディレクトリで実行されている他のチームの誰かのためにシンボリックリンクスクリプトを作成しました。
destination_path=/path/to/dest/
source_path=/path/to/src
for dir in first second
do
# replace existing symlink
for subdir in {1000..1020}
do
ln -sf $source_path/$dir/$subdir $destination_path/$dir/$subdir
done
done
スクリプトが実行される前に、他のディレクトリセットへのシンボリックリンクをpath/to/dest/$dir
含めてください。1000, 1001, ..., 1020
私のスクリプトは、これらのシンボリックリンクをシンボリックリンクに置き換えるように設計されていますが、/path/to/src/$dir/$subdir
そうではなく、代わりに既存のシンボリックリンク内にシンボリックリンクを作成します。
たとえば、/path/to/dest/$dir/1000
以前にシンボリックリンクであったのは、スクリプトを実行した後も/path/to/dest/$dir/1000
まだ同じ場所を指しますが、内部にはそれを指すシンボリックリンクが/path/to/dest/$dir/1000
あります。1000
$source_path/$dir/$subdir/1000
私のスクリプトではこれは起こらないでください。そうですか?シミュレートされたターゲットディレクトリ構造を使用してローカルで問題を再現しようとしましたが、問題を再現できませんでした。
ln -sfn
編集:追加の調査でln -sf
この問題を解決する最も簡単な方法は何ですか?
答え1
ディレクトリを指すシンボリックリンクは(ほぼ常に)そのディレクトリとして扱われます。通常、シンボリックリンクを更新するには、そのリンクを削除して再作成してください。
このようなスクリプトバリアントを使用してください。
#!/bin/bash
destination_path='/path/to/dest/'
source_path='/path/to/src'
for dir in first second
do
# replace existing symlink
for subdir in {1000..1020}
do
s="$source_path/$dir/$subdir"
t="$destination_path/$dir/$subdir"
[ -d "$t" ] && [ -h "$d/$subdir" ] && echo rm -f -- "$d/$subdir"
[ -h "$d" ] && echo rm -f -- "$d"
echo ln -sf -- "$s" "$d"
done
done
echo
必要なタスクを実行するのに満足している場合は、3つのインスタンスをすべて削除してください。