Ich habe eine Web-App, die eine Reihe symbolischer Links in Unterverzeichnissen enthält. Ich muss die App in eine andere Verzeichnisstruktur verschieben und alle Symlinks aktualisieren, um auf den neuen Pfad zu verweisen. Zum Beispiel:
Altes Dir: /home/user/public_html/dev
Neues Dir: /home/user/public_html/qa
Altes Symlink: /home/user/public_html/qa/multisites/slave01/images -> /home/user/public_html/dev/images
Neues Symlink:/home/user/public_html/qa/multisites/slave01/images -> /home/user/public_html/qa/images
Das Problem ist, dass viele davon in verschiedenen Verzeichnissen verstreut sind. Wie kann ich rekursiv vom Stamm aus suchen und alle Symlinks neu erstellen, auf die /dev/
mit verwiesen wird /qa/
?
quelle
find /home/user/public_html/qa/ -type l -lname '/home/user/public_html/dev/*'
ausführen, wird nichts ausgegeben.find /home/usr/public_html/qa/ -type l
? Wenn das die Links nicht findet, passiert etwas sehr Seltsames mit Ihrem System.find /home/user/public_html/qa/ -type l
" gibt die Links aus. Durch Hinzufügen des Parameters -lname wird jedoch nichts ausgegeben.Falls jemand anderes dies bei der Suche nach einer Lösung findet: Erstellen Sie eine Datei mit dem Namen "linkmod.sh", die Folgendes enthält:
und Renn
Bei Bedarf können Sie die Option -lname in find verwenden.
HINWEIS: Sie müssen 2x \ in den Mustern vor allen Zeichen verwenden, für die \ in sed erforderlich ist, da das Echo eines entfernt. Zum Beispiel
Entfernen Sie das
echo
aus der letzten Zeile, wenn die ln-Befehle korrekt sind.quelle
echo
in der letzten Zeile des Skripts und derecho
in demfind .. | xargs .. linkmod.sh ...
Befehl selbst beide entfernt werden müssen.Ich habe ein Bash-Skript
link_rename.sh
für das rekursive Umbenennen symbolischer Links in einem bestimmten Verzeichnis erstelltEs kann ausgeführt werden als
link_rename.sh /home/human/dir link1 link2
Das Skript hat 3 Argumente:
link1
ist das alte Muster, das ersetzt wirdlink2
ist das neue Muster, durch daslink1
ersetzt wirdDas Skript liest rekursiv alle Symlinks im Verzeichnis
find "$DIR" -type l
und verarbeitet sie zeilenweise.$line
ist der Symlink, der umbenannt werden mussCUR_LINK_PATH
ist der alte WegNEW_LINK_PATH
wird durch Ersetzen der Zeichenfolge im alten Verbindungspfad erhalten.Der alte Symlink wird entfernt und mit wird ein neuer Symlink erstellt
ln -s "$NEW_LINK_PATH" "$line"
quelle
Am Ende habe ich ein Kommandozeilen-PHP-Skript geschrieben, das den Trick zu tun scheint.
quelle