GNU/Linux >> Linux の 問題 >  >> Linux

シンボリック リンクを再帰的にバッチ更新する

次の 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" を使用して新しいシンボリック リンクが作成されます。


    Linux
    1. Linuxシンボリックリンクを更新する方法

    2. 最大のファイルを再帰的に検索しますか?

    3. 自動更新?

    1. ディレクトリを指すシンボリック リンクがあるかどうかを確認する方法はありますか?

    2. Bash でファイル拡張子を再帰的に変更する

    3. シンボリックリンクをコピーするには?

    1. シンボリック リンクの環境変数

    2. シンボリック リンクでの cd/bash の動作

    3. シンボリック リンクのレベルが多すぎます