GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Rekursive Stapelaktualisierung symbolischer Links

Dieser Bash-Befehl sollte das für Sie erledigen:

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

Es verwendet find um alle Dateien im qa zu identifizieren Verzeichnis, das symbolische Links mit einem Ziel sind, das sich in dev befindet Verzeichnis und gibt für jeden einen Bash-Befehl aus, der den Link durch einen Link zum entsprechenden Pfad in qa/ ersetzt . Nachdem Sie dies ausgeführt haben, führen Sie einfach das generierte Skript mit

aus
bash script.sh

Vielleicht möchten Sie es zuerst manuell untersuchen, um sicherzustellen, dass es funktioniert hat.

Hier ist eine ausführlichere Version des obigen find Befehl zum leichteren Lesen (obwohl ich es in der Praxis nicht unbedingt so schreiben würde):

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

Falls jemand anderes dies bei der Suche nach einer Lösung findet:Erstellen Sie eine Datei namens "linkmod.sh" mit:

#!/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"

und ausführen

find . -type l -print0 | xargs -0IX echo linkmod.sh X "pattern1" "pattern2"

Sie können bei Bedarf auch die Option -lname in find verwenden.

HINWEIS:Sie müssen 2x \ in den Mustern vor allen Zeichen verwenden, die \ in sed erfordern, da Echo eines entfernt. Zum Beispiel

find . -type l -print0 | xargs -0IX echo linkmod.sh X "folder\\ name\\/file" "folder2\\ name\\/file"

Entfernen Sie den echo ab der letzten Zeile, wenn die ln-Befehle korrekt sind.


Ich habe ein Bash-Skript link_rename.sh erstellt für das rekursive Umbenennen von symbolischen Links in einem bestimmten Verzeichnis

#! /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)

Es kann als link_rename.sh /home/human/dir link1 link2 ausgeführt werden

Das Skript hat 3 Argumente:

  1. Das Verzeichnis, in dem Sie die Batch-Umbenennung von Symlinks durchführen möchten
  2. Das alte Muster. Hier link1 ist das alte Muster, das ersetzt wird
  3. Das neue Muster. Hier link2 ist das neue Muster, mit dem link1 wird ersetzt

Das Skript liest rekursiv alle Symlinks im Verzeichnis mit find "$DIR" -type l und verarbeitet sie Zeile für Zeile.

$line ist der Symlink, der umbenannt werden muss

CUR_LINK_PATH ist der alte Pfad

NEW_LINK_PATH wird durch String-Ersetzung im alten Link-Pfad erhalten.

Der alte Symlink wird entfernt und ein neuer Symlink wird mit ln -s "$NEW_LINK_PATH" "$line" erstellt


Linux
  1. So aktualisieren Sie einen Linux-Symlink

  2. Automatisches Update?

  3. Gibt es eine Möglichkeit zu überprüfen, ob symbolische Links auf ein Verzeichnis verweisen?

  4. Wie kopiere ich symbolische Links?

  5. Verwenden Sie SED rekursiv unter Linux?

So entfernen (löschen) Sie symbolische Links in Linux

Anleitung zum Hinzufügen symbolischer Linux-Links

Eine einfache Möglichkeit, symbolische Links in Linux aufzulisten

So finden Sie defekte Symlinks in Linux

So erhalten Sie eine Liste symbolischer Links unter Linux

rsync und symbolische Links