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
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:
- Das Verzeichnis, in dem Sie die Batch-Umbenennung von Symlinks durchführen möchten
- Das alte Muster. Hier
link1
ist das alte Muster, das ersetzt wird - Das neue Muster. Hier
link2
ist das neue Muster, mit demlink1
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