次の bash コマンドで実行できます:
find /home/user/public_html/qa/ -type l -lname '/home/user/public_html/dev/*' -printf 'ln -nsf "$(readlink "%p" | sed s/dev/qa/)" "$(echo "%p" | sed s/dev/qa/)"\n' > script.sh
find
を使用しています qa
内のすべてのファイルを識別する dev
にあるターゲットとのシンボリック リンクであるディレクトリ ディレクトリごとに、リンクを qa/
の同等のパスへのリンクに置き換える bash コマンドを出力します。 .これを実行した後、生成されたスクリプトを
bash script.sh
最初に手動で調べて、機能することを確認することをお勧めします。
上記の find
のより詳細なバージョンを次に示します。 読みやすくするためのコマンド (ただし、実際にはこのように書く必要はありません):
SRC_DIR="/home/user/public_html/qa"
OLD_TARGET="/home/user/public_html/dev"
SUB="s/dev/qa/"
find $SRC_DIR -type l \
-lname "$OLD_TARGET/*" -printf \
'ln -nsf "$(readlink "%p"|sed $SUB)" "$(echo "%p"|sed $SUB)"\n'\
> script.sh
他の誰かが解決策を探しているときにこれを見つけた場合:次を含む「linkmod.sh」という名前のファイルを作成します:
#!/bin/sh
PATTERN1=`echo "$2"`
PATTERN2=`echo "$3"`
LINKNAME=`echo "$1"`
OLDTARGET=`readlink "$1"`
NEWTARGET=`echo "$OLDTARGET" \
| sed -e 's/'"$PATTERN1"'/'"$PATTERN2"'/'`
echo ln -nsf "$NEWTARGET" "$LINKNAME"
そして実行
find . -type l -print0 | xargs -0IX echo linkmod.sh X "pattern1" "pattern2"
必要に応じて、find で -lname オプションを使用できます。
注:sed で \ を必要とする文字の前に、パターンで 2x \ を使用する必要があります。これは、echo によって削除されるためです。例えば
find . -type l -print0 | xargs -0IX echo linkmod.sh X "folder\\ name\\/file" "folder2\\ name\\/file"
echo
を削除します ln コマンドが正しければ最後の行から。
bash スクリプト link_rename.sh
を作成しました 特定のディレクトリ内のシンボリック リンクの名前を再帰的に変更する
#! /bin/bash
DIR=$1
OLD_PATTERN=$2
NEW_PATTERN=$3
while read -r line
do
echo $line
CUR_LINK_PATH="$(readlink "$line")"
NEW_LINK_PATH="$CUR_LINK_PATH"
NEW_LINK_PATH="${NEW_LINK_PATH/"$OLD_PATTERN"/"$NEW_PATTERN"}"
rm "$line"
ln -s "$NEW_LINK_PATH" "$line"
done <<< $(find "$DIR" -type l)
link_rename.sh /home/human/dir link1 link2
として実行できます
スクリプトには 3 つの引数があります:
<オール>link1
は置き換えられる古いパターンですlink2
link1
の新しいパターンです。 置き換えられます
スクリプトは、find "$DIR" -type l
を使用して、ディレクトリ内のすべてのシンボリック リンクを再帰的に読み取ります。 行ごとに処理します。
$line
名前を変更する必要があるシンボリックリンクです
CUR_LINK_PATH
は古いパスです
NEW_LINK_PATH
古いリンク パスで文字列置換を実行することによって取得されます。
古いシンボリック リンクが削除され、ln -s "$NEW_LINK_PATH" "$line"
を使用して新しいシンボリック リンクが作成されます。